当涉及标签上的非标准属性时,HTML(或者可能只是XHTML?)相对严格。如果它们不是规范的一部分,那么您的代码将被视为不符合规范。
但是,非标准属性对于将元数据传递到Javascript可能非常有用。例如,如果假设链接显示弹出窗口,则可以在属性中设置弹出窗口的名称:
popup_title="Title for My Popup">click me
或者,您可以将弹出窗口的标题存储在一个隐藏元素中,例如跨度:
.popup .title { display: none; }
但是,我对于应该采用哪种方法感到不满意。第一种方法更简洁,我猜想,它不会像搜索引擎和屏幕阅读器那样费劲。相反,第二个选项使存储大量数据更加容易,因此用途更加广泛。它也符合标准。
我很好奇这些社区的想法。您如何处理这种情况?第一种方法的简单性是否超过潜在的缺点(如果有)?
AFAIK,expando属性是在运行时使用JavaScript设置的。 它们不是XHTML本身的一部分
自定义属性提供了一种方便的方式来将额外的数据传送到客户端。 Dojo Toolkit会定期执行此操作,并且指出了(揭穿Dojo Toolkit神话):
Custom attributes have always been
valid HTML, they just don’t validate
when tested against a DTD. [...] The
HTML specification states that any
attribute not recognized is to be
ignored by the HTML rendering engine
in user agents, and Dojo optionally
takes advantage of this to improve
var link_titles = {link1:"Title 1", link2:"Title 2"};
然后,您可以稍后在Javascript代码中使用它,假设您的链接具有与该哈希表中的ID相对应的ID。
它没有其他两种方法的缺点:没有非标准属性,也没有丑陋的隐藏范围。
缺点是,对于像您的示例这样简单的事情,它可能有点过大。但是对于更复杂的场景,如果您要传递更多的数据,这是一个不错的选择。特别是考虑到数据是作为JSON传递的,因此您可以轻松传递复杂的对象。
此外,您还可以将数据与格式分开保存,这对于可维护性来说是一件好事。
var poi_types = {1:"City", 2:"Restaurant"};
并且由于您极有可能使用了某些服务器端编程语言,因此该哈希表应微不足道以动态生成(只需将其序列化为JSON并将其吐到页面的页眉部分)。
有时,如果我真的需要,我会破坏规格。但是很少,而且只有正当的理由。
编辑:不确定为什么为-1,但我指出有时您认为需要打破规格,而不必这样做。
$('#anchor_id .articleid').val()
是的,但是最好的方法是使用:。因为该类是CSS的东西,所以如果该类不在样式信息中,则实际上给出了无效的代码。即使关闭JS或CSS,数据也将保持隐藏状态。
@ Yeti,class不是CSS的东西,如果它没有出现在样式中也不是无效的。像其他任何属性一样,它只是元素上的数据。与CSS的关联在于它是受支持的选择器。
最后,我的解决方案是将ID数据隐藏在以某种分隔符分隔的id标记中(一个下划线是一个空格,两个是该arg的结尾),第二个arg有一个id:
丑陋的,它假定您尚未将id标记用于其他用途,但它在所有浏览器中均兼容。
我也一直为此绞尽脑汁。我喜欢非标准属性的可读性,但我不喜欢它会破坏标准。隐藏的跨度示例是合规的,但可读性不强。那这个呢:
rel属性描述当前页面和链接资源之间的关系。它不是通用的"存储所需的任何数据"属性。所以这太可怕了。
当前的任何浏览器都支持吗? -有什么要支持的?浏览器已经可以容忍不兼容的代码。考虑到这是新HTML5的一部分,因此不必担心像添加其他自定义属性一样添加data-属性。
在您的示例中,我个人认为跨度路由更合适,因为它符合XHTML规范的标准。但是,我可以看到自定义属性的变化,但是我认为它们增加了不必要的混乱程度。
但是,SPAN路由是对标记的滥用。它可能符合验证标准,但不符合语义标准。