是或不是?
最近我一直在阅读越来越多关于在HTML标签中使用自定义属性的人,主要是为了嵌入一些额外的数据以用于JavaScript代码。
我希望收集一些关于是否使用自定义属性的良好做法的反馈,以及其他替代方法。
它似乎可以真正简化服务器端和客户端代码,但它也不符合W3C标准。
我们是否应该在我们的Web应用程序中使用自定义HTML属性? 为什么或者为什么不?
对于那些认为自定义属性是好事的人来说:使用它们时需要注意哪些事项?
对于那些认为自定义属性是坏事的人:你用什么替代方法来完成类似的事情?
更新:我最感兴趣的是各种方法背后的推理,以及为什么一种方法比另一种更好。 我想我们都可以拿出4-5种不同的方式来完成同样的事情。 (隐藏元素,内联脚本,额外的类,来自ID的解析信息等)。
更新2:看起来HTML5 data-
属性功能在这里有很多支持(我倾向于同意,它看起来像一个可靠的选项)。 到目前为止,我还没有看到这个建议的反驳方式。 是否有任何问题/陷阱担心使用这种方法? 还是仅仅是当前W3C规范的“无害”无效?
HTML 5显式允许以data
开头的自定义属性。 因此,例如, <p data-date-changed="Jan 24 5:23 pm">Hello</p>
有效。 由于它是由一个标准正式支持的,我认为这是自定义属性的最佳选择。 它并不要求你用黑客来重载其他属性,所以你的HTML可以保持语义。
资料来源:http://www.w3.org/TR/html5/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes
这是我最近使用的一种技术:
<div id="someelement">
<!-- {
someRandomData: {a:1,b:2},
someString: "Foo"
} -->
<div>... other regular content...</div>
</div>
注释对象绑定到父元素(即#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/>
),因为注释必须位于元素的内部才能被视为元素的数据。
编辑 :
这项技术的显着优势:
以下是解析器代码(从上面的http://pastie.org/511358超链接复制而来,以防它在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|rn/g, '');
if ( /^s*?{.+}s*?$/.test(cData) ) {
try {
data(comment.parentNode).commentJSON =
(new Function('return ' + cData + ';'))();
} catch(e) {}
}
}
return data(context).commentJSON || true;
};
})();
如果您为页面指定模式,则可以创建任何属性。
例如:
前页
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:addthis="http://www.addthis.com/help/api-spec">
...
<a addthis:title="" addthis:url="" ...>
Facebook(甚至标签)
<html xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml">
...
<fb:like href="http://developers.facebook.com/" width="450" height="80"/>
链接地址: http://www.djcxy.com/p/15465.html
上一篇: Yea or nay?
下一篇: What is the difference between JavaScript's getElementById() and getElementsByName() functions?