Javascript DOM:设置自定义DOM元素属性

时间:2011-10-25 20:37:44

标签: javascript dom

可以在DOM元素上设置自定义属性,并依赖它们持续存在吗?

例如,给定

 <html><body><div id="foo"></div></body></html>

document.getElementById('foo').bar = "baz";是否公平,期望document.getElementsByTagName('div')[0].bar等于"baz"

请注意,我在这里讨论的是属性,就像普通的javascript对象属性一样,而不是元素属性。

我对它是如何跨浏览器感兴趣,以及它是否支持任何规范。

DOM API是否保证每次都会为同一个DOM元素返回相同的javascript对象?

4 个答案:

答案 0 :(得分:6)

作为一般规则,请勿使用自定义属性。您不应该以他们不期望的方式修改DOM对象,因为它们的行为可能不像您认为的那样。

HTML5中自定义属性的机制是使用data-前缀。

然而,HTML5并不是一个标准,并没有广泛实施。但是如果你对 data - 属性使用 set / getAttribute ,它应该适用于所有合理的现代浏览器,并且将来不应该使用数据引入标准属性 - 前缀。

但话虽如此,我仍然建议使用自定义对象来存储值并通过元素 id class 或其他一些标准引用它们(如在HTML中) 4.01)属性值。它避免了自定义属性和属性的问题,并且已知可以在任何地方使用。

答案 1 :(得分:4)

嗯,有dataset属性:

div.dataset.bar = 'baz';

但它没有在IE中实现。

现场演示: http://jsfiddle.net/simevidas/dJr2u/

答案 2 :(得分:1)

没有

让我们说5年前你认为属性.contains是一个很好的用例,用于说明元素是否包含一些特殊数据。

所以你写了document.getElementById("someId").contains = true

然后你有像if (document.getElementByID("someId").contains)

这样的支票

今天因为Node.prototype.contains是一种方法而中断。

基本上你的代码将来都不安全。

答案 3 :(得分:0)

这是规范对内部属性访问器的说法:

  

主机对象可以以任何方式实现这些内部方法,除非   另有规定;例如,一种可能性是[[Get]]和   [[Put]]对于特定主机对象确实是获取和存储属性   值,但[[HasProperty]]始终生成错误。

  

主机对象可以在[[Put]]上定义其他约束   操作。如果可能,主机对象不应允许[[Put]]   在[[CanPut]]的定义返回的情况下的操作   假的。

但是,我认为这只是理论上的,实际上expandos按预期工作。