jjzjj

javascript - Chrome getElementsByTagName 返回 HTMLCollection 与 NodeList

coder 2024-07-24 原文

我发现 JavaScript 函数 getElementsByTagName 会根据浏览器返回不同的数据。 Chrome 发回的 HTML 集合比 Firefox、IE 或 Chromium 更长(真的,更好,IMO)。

我将在下面概述我的发现。我的问题本质上是“为什么 Chrome 会改变这个,其他浏览器也会这样做(什么时候?),以及返回的 length 属性有多可靠?”

比较 Chrome(版本 34.0.1847.116 m) 与 Chromium(版本 33.0.1750.152 Ubuntu 13.10 (256984))。我确实注意到这个 Chromium 版本有点落后于 Chrome(v33 与 v34),所以它可能也在 Ubuntu Chromum 版本中朝着这个方向发展,但它至少帮助我比较了这里发生的事情。

考虑以下代码块:

<script type='text/javascript'>
function getElements(){
  var x=document.getElementsByTagName("input");
  console.log(x.length);
  console.log(x);
}
</script>
<form>
<input type="text" size="20" id='test1'><br>
<input type="text" size="20" id='test2'><br>
<input type="text" size="20" id='test3'><br><br>
<input type="button" onclick="getElements()" value="How many input elements?">
</form>

在 Chromium 和其他浏览器中运行上面的结果显示长度为 4,并且返回的数据是一个索引数组,类似于:

[输入#test1、输入#test2、输入#test3、输入、项目:函数] 0: 输入#test1 1: 输入#test2 2:输入#test3 3:输入 长度:4 __proto__: 节点列表

Chrome 返回一个相似但扩展的结果数组:

[input#test1, input#test2, input#test3, input, test1: input#test1, test2: input#test2, test3: input#test3, item: function, namedItem: function] 0: 输入#test1 1: 输入#test2 2:输入#test3 3:输入 长度:4 测试1:输入#test1 测试2:输入#test2 测试3:输入#test3 __proto__: HTMLCollection

请注意,在这两种情况下,长度都是 4,但 Chromium 第二次包含每个输入元素,由元素的 ID 属性而不是索引键索引。 Chrome 正在返回一个 HTMLCollection,其中 Chromium 提供一个 NodeList

在过去,我使用 for x in y 语法处理这些数组,加上一些验证,如下所示:

var inputs = document.getElementsByTagName('input');
for (x in inputs){
  if(inputs[x].id != undefined){
  }
}

我得出的结论是,这样使用结果:

var inputs = document.getElementsByTagName('input');
for (x=0; x<inputs.length; x++){
}

无论哪种方式,您都可以使用 inputs[x] 访问您的元素,但使用第二种方法我们保证 x 始终是我们用作键的整数之一.在第一种方法中,x 将是一个整数键,然后是字符串“length”,然后是任何 ID 字符串。

最佳答案

来自开发者 firefox documentation :

While the W3C DOM 3 Core specification says elements is a NodeList that was simply because of a an attempt to have the "core" specification not depend on the "html" specification at that time. The DOM 4 draft says that elements is an HTMLCollection.

Gecko/Firefox currently returns a NodeList (Bug 162927) but starting with Gecko/Firefox 19, this method will return HTMLCollection (Bug 799464). Internet Explorer returns a HTMLCollection. WebKit returns a NodeList. Opera also returns a NodeList, but with a namedItem method implemented, which makes it similar to a HTMLCollection.

关于javascript - Chrome getElementsByTagName 返回 HTMLCollection 与 NodeList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23245240/

有关javascript - Chrome getElementsByTagName 返回 HTMLCollection 与 NodeList的更多相关文章

随机推荐