可以在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对象?
答案 0 :(得分:6)
作为一般规则,请勿使用自定义属性。您不应该以他们不期望的方式修改DOM对象,因为它们的行为可能不像您认为的那样。
HTML5中自定义属性的机制是使用data-前缀。
然而,HTML5并不是一个标准,并没有广泛实施。但是如果你对 data - 属性使用 set / getAttribute ,它应该适用于所有合理的现代浏览器,并且将来不应该使用数据引入标准属性 - 前缀。
但话虽如此,我仍然建议使用自定义对象来存储值并通过元素 id 或 class 或其他一些标准引用它们(如在HTML中) 4.01)属性值。它避免了自定义属性和属性的问题,并且已知可以在任何地方使用。
答案 1 :(得分:4)
答案 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按预期工作。