Custom attributes - Yea or nay?

前端 未结 14 2030
南旧
南旧 2020-11-22 03:02

Recently I have been reading more and more about people using custom attributes in their HTML tags, mainly for the purpose of embedding some extra bits of data for use in ja

14条回答
  •  时光说笑
    2020-11-22 03:44

    Here's a technique I've been using recently:

    ... other regular content...

    The comment-object ties to the parent element (i.e. #someelement).

    Here's the parser: http://pastie.org/511358

    To get the data for any particular element simply call parseData with a reference to that element passed as the only argument:

    var myElem = document.getElementById('someelement');
    
    var data = parseData( myElem );
    
    data.someRandomData.a; // <= Access the object staight away
    

    It can be more succinct than that:

  • ... content ...
  • Access it:

    parseData( document.getElementById('foo') ).specialID; // <= 245
    

    The only disadvantage of using this is that it cannot be used with self-closing elements (e.g. ), since the comments must be within the element to be considered as that element's data.


    EDIT:

    Notable benefits of this technique:

    • Easy to implement
    • Does not invalidate HTML/XHTML
    • Easy to use/understand (basic JSON notation)
    • Unobtrusive and semantically cleaner than most alternatives

    Here's the parser code (copied from the http://pastie.org/511358 hyperlink above, in case it ever becomes unavailable on pastie.org):

    var parseData = (function(){
    
        var getAllComments = function(context) {
    
                var ret = [],
                    node = context.firstChild;
    
                if (!node) { return ret; }
    
                do {
                    if (node.nodeType === 8) {
                        ret[ret.length] = node;
                    }
                    if (node.nodeType === 1) {
                        ret = ret.concat( getAllComments(node) );
                    }
                } while( node = node.nextSibling );
    
                return ret;
    
            },
            cache = [0],
            expando = 'data' + +new Date(),
            data = function(node) {
    
                var cacheIndex = node[expando],
                    nextCacheIndex = cache.length;
    
                if(!cacheIndex) {
                    cacheIndex = node[expando] = nextCacheIndex;
                    cache[cacheIndex] = {};
                }
    
                return cache[cacheIndex];
    
            };
    
        return function(context) {
    
            context = context || document.documentElement;
    
            if ( data(context) && data(context).commentJSON ) {
                return data(context).commentJSON;
            }
    
            var comments = getAllComments(context),
                len = comments.length,
                comment, cData;
    
            while (len--) {
                comment = comments[len];
                cData = comment.data.replace(/\n|\r\n/g, '');
                if ( /^\s*?\{.+\}\s*?$/.test(cData) ) {
                    try {
                        data(comment.parentNode).commentJSON =
                            (new Function('return ' + cData + ';'))();
                    } catch(e) {}
                }
            }
    
            return data(context).commentJSON || true;
    
        };
    
    })();
    

提交回复
热议问题