【发布时间】:2015-06-02 14:00:53
【问题描述】:
我最近发现了在 Javascript 中设置自定义 DOM 属性的两种方法之间的一个非常根本的区别。区别在于 HTML5 Selectors API 如何与这些属性交互(即在 document.querySelector() 和朋友中)。
<button id="b3">View</button>
<script>
document.getElementById('b3').shape = 'square';
console.log( document.querySelector('*[shape]') ); // FAIL: returns null
document.getElementById('b3').setAttribute('shape','square');
console.log( document.querySelector('*[shape]') ); // WORKS: returns element
</script>
因此,基本上如果您在不使用.setAttribute() 的情况下将属性应用于元素,那么您以后无法通过属性名称选择元素。
顺便说一句。这种行为在浏览器中是一致的,这让我认为它可能会被标准解决,但是我看不到它:
选择器 API 标准似乎并不关心:
选择器允许表示元素的属性。当一个 选择器用作匹配元素的表达式, 属性选择器必须被认为匹配一个元素,如果 元素具有与由 属性选择器。
整个属性匹配规则似乎归结为“如果元素具有属性”,您会认为someElement.someAttribute = something 会满足“具有属性”的标准,但无论出于何种原因它没有。
我的问题基本上是为什么不同?它实际上是标准的一部分,还是只是所有主要浏览器(IE11、FF38 和 Chrome 43)中的相同实现怪癖?
【问题讨论】:
-
这可能很有趣:stackoverflow.com/questions/19246714/…(以及它的副本)
标签: javascript html