[英]Javascript DOM: Setting custom DOM element properties
是否可以在DOM元素上設置自定義屬性,並依賴它們持久化?
例如,給定
<html><body><div id="foo"></div></body></html>
做document.getElementById('foo').bar = "baz";
是否公平document.getElementById('foo').bar = "baz";
,並期望document.getElementsByTagName('div')[0].bar
等於"baz"
?
請注意,我在這里談論的是屬性,就像普通的javascript對象屬性一樣,而不是元素屬性。
我對它是如何跨瀏覽器感興趣,以及它是否支持任何規范。
DOM API是否保證每次都會為同一個DOM元素返回相同的javascript對象?
作為一般規則,請勿使用自定義屬性。 您不應該以他們不期望的方式修改DOM對象,因為它們可能不會按照您的想法行事。
HTML5中自定義屬性的機制是使用數據前綴。
但是,HTML5並不是一個標准,並沒有廣泛實現。 但是如果你對數據屬性使用set / getAttribute ,它應該適用於所有相當現代的瀏覽器,並且將來不應該使用數據前綴引入標准屬性。
但話雖如此,我仍然建議使用自定義對象來存儲值,並通過元素id或類或其他標准(如HTML 4.01中)屬性值來引用它們。 它避免了自定義屬性和屬性的問題,並且已知可以在任何地方使用。
沒有。
讓我們說5年前你認為屬性.contains
是一個很好的用例,用於說明元素是否包含一些特殊數據。
所以你寫了document.getElementById("someId").contains = true
然后你有像if (document.getElementByID("someId").contains)
今天因為Node.prototype.contains
是一個方法而中斷。
基本上你的代碼不是未來的安全。
這是規范對內部屬性訪問器的說法:
除非另有說明,否則Host對象可以以任何方式實現這些內部方法; 例如,一種可能性是特定主機對象的[[Get]]和[[Put]]確實獲取並存儲屬性值,但[[HasProperty]]始終生成false。
和
主機對象可以在[[Put]]操作上定義附加約束。 如果可能,在[[CanPut]]的此定義返回false的情況下,主機對象不應允許[[Put]]操作。
但是,我認為這只是理論上的,實際上expandos正如預期的那樣工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.