Answers:
getAttribute
检索DOM元素的属性,同时el.id
检索此DOM元素的属性。她们不一样。
大多数情况下,DOM属性与属性同步。
但是,同步不能保证相同的值。一个经典的例子是在el.href
和之间el.getAttribute('href')
对一个锚定元件。
例如:
<a href="/" id="hey"></a>
<script>
var a = document.getElementById('hey')
a.getAttribute('href') // "/"
a.href // Full URL except for IE that keeps '/'
</script>
发生这种现象是因为根据W3C,href属性必须是格式正确的链接。大多数浏览器都遵守此标准(猜测谁不这样做?)。
input
的checked
属性还有另一种情况。DOM属性返回true
或false
当属性返回字符串时"checked"
或空字符串。
然后,有些属性仅单向同步。最好的例子是元素的value
属性input
。通过DOM属性更改其值不会更改属性(编辑:检查第一个注释以更精确)。
由于这些原因,我建议您继续使用DOM 属性,而不要使用属性,因为它们的行为在浏览器之间是不同的。
实际上,只有两种情况需要使用属性:
value
的的input
元素)。如果您想要更详细的说明,强烈建议您阅读此页面。只需几分钟,但是您会对信息(我在这里总结)感到高兴。
value
输入的属性确实从属性中获取了其初始值,但在其他情况下则完全没有关系。该value
属性与该defaultValue
属性完全同步。同样checked
和defaultChecked
。在旧版IE(<= 7和更高版本的兼容模式)中,破损了getAttribute()
和setAttribute()
。
a.href
返回完整的URL,a.getAttribute("href")
返回与HTML源代码中定义的属性完全相同的属性。
input.formAction
)或空字符串(例如a.download
),这会使事情变得模棱两可。唯一的例外是未进行双向同步的值,例如value
。
getAttribute('attribute')
通常,将属性值作为字符串返回,与页面的HTML源代码中定义的完全相同。
但是,element.attribute
可以返回该属性的归一化或计算值。例子:
<a href="https://stackoverflow.com/foo"></a>
<input type="checkbox" checked>
<input type="checkbox" checked="bleh">
<img src='http://dummyimage.com/64x64/000/fff'>
<img src='http://dummyimage.com/64x64/000/fff' width="50%">
<img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
<div style='background: lime;'></div>
.id
节省了函数调用的开销。(很小,但是您问过。)
基于属性的CSS样式在这方面有很大的不同。
考虑以下:
const divs = document.querySelectorAll('div');
divs[1].custom = true;
divs[2].setAttribute('custom', true);
div {
border: 1px solid;
margin-bottom: 8px;
}
div[custom] {
background: #36a;
color: #fff;
}
<div>A normal div</div>
<div>A div with a custom property set directly.</div>
<div>A div with a custom attribute set with `setAttribute`</div>
直接设置了custom属性的div不会将值反映到该属性,并且也不是由div[custom]
CSS中的属性选择器()选择的。
setAttribute
但是,可以使用css属性选择器选择使用设置了自定义属性的div,并相应地设置样式。