최근에 사용한 기술이 있습니다.
<div id="someelement">
<!-- {
someRandomData: {a:1,b:2},
someString: "Foo"
} -->
<div>... other regular content...</div>
</div>
comment-object는 부모 요소 (예 : #someelement)에 연결됩니다.
파서는 다음과 같습니다. http://pastie.org/511358
특정 요소에 대한 데이터를 얻으려면 parseData
유일한 인수로 전달 된 해당 요소에 대한 참조로 호출 하십시오.
var myElem = document.getElementById('someelement');
var data = parseData( myElem );
data.someRandomData.a; // <= Access the object staight away
그보다 더 간결 할 수 있습니다.
<li id="foo">
<!--{specialID:245}-->
... content ...
</li>
액세스 :
parseData( document.getElementById('foo') ).specialID; // <= 245
이것을 사용하는 유일한 단점은 자체 폐쇄 요소 (예 :)와 함께 사용할 수 없다는 점입니다 <img/>
. 주석은 해당 요소의 데이터로 간주 될 요소 내에 있어야 하기 때문입니다.
편집 :
이 기술의 주목할만한 이점 :
- 손쉬운 구현
- 합니까 하지 무효화 HTML / XHTML
- 사용하기 쉽고 이해하기 (기본 JSON 표기법)
- 대부분의 대안보다 눈에 거슬리지 않고 의미 론적으로 깨끗합니다.
파서 코드는 다음과 같습니다 ( pastie.org에서 사용할 수없는 경우 http://pastie.org/511358 하이퍼 링크 에서 복사 ).
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;
};
})();