getAttribute() 与 Element 对象属性?

IT技术 javascript html dom
2021-01-28 21:56:20

表达式 likeElement.getAttribute("id")Element.idreturn 相同的东西。

当我们需要 HTMLElement 对象的属性时应该使用哪一个?

这些方法是否有任何跨浏览器问题,例如getAttribute()setAttribute()

或者直接访问对象属性与使用这些属性方法对性能有什么影响?

6个回答

getAttribute检索DOM 元素属性,同时el.id检索该 DOM 元素属性他们不一样。

大多数时候,DOM 属性与属性同步。

但是,同步并不能保证相同的值一个经典的例子是锚元素之间el.hrefel.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 属性必须是格式良好的链接。大多数浏览器都尊重这个标准(猜猜谁不尊重?)。

inputchecked属性还有另一种情况DOM 属性返回truefalse而属性返回字符串"checked"或空字符串。

然后,有一些属性是单向同步的最好的例子是元素value属性input通过 DOM 属性更改其值不会更改属性(编辑:检查第一条注释以获得更精确的信息)。

由于这些原因,我建议您继续使用 DOM属性,而不是属性,因为它们的行为因浏览器而异。

实际上,只有两种情况需要使用属性:

  1. 自定义 HTML 属性,因为它未同步到 DOM 属性。
  2. 要访问一个内置的HTML属性,这是不是从属性同步,并且你确定你所需要的属性(例如,原来value的的input元素)。

如果您想要更详细的解释,我强烈建议您阅读此页面您只需花几分钟时间,但您会对这些信息感到高兴(我在这里总结了这些信息)。

+1 一般是好的建议。不过,同步的事情有点不对劲:value输入属性确实从属性中获取其初始值,但在其他方面根本不与它相关联。value属性与属性完全同步defaultValue同样checkeddefaultChecked除了在旧的 IE(<=7 和以后的兼容模式)中,它已损坏getAttribute()setAttribute().
2021-03-17 21:56:20
我认为你把第一个例子弄错了。a.href返回完整的 URL,a.getAttribute("href")返回与 HTML 源代码中定义完全相同的属性。
2021-03-20 21:56:20
将您的评论添加为“进一步解释”:-)
2021-03-26 21:56:20
如果 dom 中根本没有设置 id,getAttribute 将返回 null,element.id 将返回一个空字符串。这是标准吗?
2021-04-03 21:56:20
如果您试图确定某个值是否为非默认值,则最好使用属性。许多现代浏览器会返回默认值(例如input.formAction)或空字符串(例如a.download),这使事情变得模棱两可。唯一的例外是不是 2 路同步的值,例如value.
2021-04-08 21:56:20

getAttribute('attribute') 通常以字符串形式返回属性值,与页面的 HTML 源代码中定义的完全相同。

但是,element.attribute可以返回属性的规范化或计算值。例子:

  • <a href="/foo"></a>
    • a.href 将包含完整的URL
  • <input type="checkbox" checked>
    • input.checked 将为真(布尔值)
  • <input type="checkbox" checked="bleh">
    • input.checked 将为真(布尔值)
  • <img src='http://dummyimage.com/64x64/000/fff'>
    • img.width 将在加载图像之前为 0(数字)
    • 加载图像(或图像的前几个字节)时,img.width 将为 64(数字)
  • <img src='http://dummyimage.com/64x64/000/fff' width="50%">
    • img.width 将是计算的50%
  • <img src='http://dummyimage.com/32x32/000/fff' style='width: 50px'>
    • img.width 将为 50(数字)
  • <div style='background: lime;'></div>
    • div.style 将是一个对象

根据这个 jsPerf 测试 getAttributeid属性更慢

聚苯乙烯

奇怪的是,这两个语句在 IE8 上的表现都非常糟糕(与其他浏览器相比)。

除非有特殊原因,否则请始终使用这些属性。

  • getAttribute()setAttribute()在较旧的 IE 中损坏(以及更高版本中的兼容模式)
  • 属性更方便(特别是那些对应于布尔属性的)

一些例外

  • 访问<form>元素的属性
  • 访问自定义属性(尽管我完全不鼓励使用自定义属性)

我已经在 SO 上写过几次关于这个主题的文章:

@MattMcDonald:是的,这就是我暗指的破碎。我没有在这个答案中扩展它,因为我觉得我在链接到的其他答案中已经做得足够了:)
2021-03-31 21:56:20
在 IE 8 之前,属性和属性被同等对待正如您之前提到的,属性是必经之路。
2021-04-05 21:56:20

.id节省函数调用开销。(这是非常小的,但你问了。)

嗨 gdoron,只是为了好奇:我试图找到对此的“官方”解释(超出经验测试,这已经足够清楚 ;) )但没有成功。你有任何关于它的链接吗?
2021-04-03 21:56:20