像Element.getAttribute("id")
和Element.id
这样的表达式会返回相同的结果。getAttribute()与Element对象的属性?
当我们需要一个HTMLElement对象的属性时应该使用哪一个?
这些方法有没有任何跨浏览器问题,如getAttribute()
和setAttribute()
?
或直接访问对象属性与使用这些属性方法之间对性能的任何影响?
像Element.getAttribute("id")
和Element.id
这样的表达式会返回相同的结果。getAttribute()与Element对象的属性?
当我们需要一个HTMLElement对象的属性时应该使用哪一个?
这些方法有没有任何跨浏览器问题,如getAttribute()
和setAttribute()
?
或直接访问对象属性与使用这些属性方法之间对性能的任何影响?
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"
或空字符串。
然后,有一些属性是同步单向只有。最好的例子是input
元素的value
属性。通过DOM属性更改其值不会更改属性(编辑:检查更精确的第一个注释)。
由于这些原因,我建议您继续使用DOM 属性,而不是属性,因为它们在浏览器中的行为不同。
在现实中,只有两种情况下,你需要使用的属性:
input
元素的原始value
)。如果您想要更详细的解释,我强烈建议您阅读this page。它只会花你几分钟,但你会很高兴的信息(我在这里总结)。
+1通常很好的建议。尽管如此,同步的东西并没有什么意义:输入的'value'属性从属性获得它的初始值,但是根本不与它绑定。 'value'属性完全同步,而不是'defaultValue'属性。同样'checked'和'defaultChecked'。除了在旧的IE(<= 7和以后的兼容模式)之外,它破坏了'getAttribute()'和'setAttribute()'。 – 2012-04-23 12:29:40
添加您的评论作为“进一步解释”:-) – 2012-04-23 12:33:20
感谢蒂姆和弗洛里安:) – 2012-04-23 12:35:17
.id
保存了函数调用开销。 (这是非常小的,但你问。)
嗨gdoron,只是为了好奇:我试图找到对此的“官方”解释(超出经验测试,这足够清楚了)),但没有成功。你有任何关于它的链接? – mamoo 2012-04-23 12:19:05
基准函数开销是所有邪恶的根源... – gdoron 2012-04-23 12:19:50
除非有特殊原因,否则请务必使用这些属性。
getAttribute()
和setAttribute()
老年IE(和更高版本兼容模式)<form>
元素的属性我写有关此主题的几次上SO:
在IE 8之前,属性和属性[被同等对待](http://msdn.microsoft.com/en-us/library/dd347148(v = VS.85 )的.aspx)。正如你之前提到的,房地产是要走的路。 – 2012-04-23 17:21:44
@MattMcDonald:是的,这就是我所指的破碎。我没有在这个答案中扩展它,因为我觉得我已经做了足够的其他答案,我链接到:) – 2012-04-23 17:32:52
getAttribute('attribute')
通常以字符串的形式返回属性值,完全如页面的HTML源代码中所定义。
但是,element.attribute
可能会返回属性的标准化或计算值。例子:
<a href="/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>
尝试例如低于完全理解这一点。对于下面的DIV
<div class="myclass"></div>
的Element.getAttribute('class')
将返回myclass
但你必须使用Element.className
从DOM属性进行检索。
一个区域,这是一个很大的区别是基于属性的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>
直接设置并不能反映价值的属性自定义属性的DIV,而不是由我们的属性选择器选择(div[custom]
)在CSS中。
但是,使用setAttribute
设置自定义属性的div可以使用css属性选择器进行选择并进行相应设置。
相似的问题:[属性和HTML](http://stackoverflow.com/questions/6003819/properties-and-attributes-in-html) – sleske 2013-10-12 18:14:20