0

我正在制作一个书签,但我在 IE8 中遇到了一些奇怪的行为。导致问题的代码是这样的:

var els = document.getElementById("my_id").getElementsByTagName("*");
for(var i in els)
{
    alert(i+","+els[i])
}

警告的第一件事是“长度,n”。这不是 chrome 中的情况:只是在 IE8 中。

有趣的是,根据代码是进入控制台/地址栏还是页面本身,它的行为似乎有所不同。

这是标准行为吗?

编辑:

也不是我运行它的网站。是否有可能返回一个在 IE 中设置键getElementsByTagName的数组?"length"它当然不会返回纯数组。

4

6 回答 6

3

你得到的不是一个数组,它是一个nodeList。看到这里,点击链接“getElementsByTagName('element_name')”

此外, for..in 无论如何都不意味着用于迭代数组。采用

var item;
for (var idx=0, len=arr.length; idx<len; ++idx) {
  item = arr[idx];
  // whatever
}

用于数组迭代。

对于节点列表,您可以使用

list.item(idx); // where list is what you got from getElementsByTagName

如果你想“正确”地做到这一点。

于 2010-03-24T18:42:04.780 回答
2

IE 行为是正确的。它可能会返回各种奇怪的东西,因为它会for .. in遍历对象的所有成员名称。

getElementsByTagName返回 a NodeList,并且 a 的属性NodeListDOM 标准中指定:lengthitem(i). 大多数 JavaScript 实现也将允许[i].

因此,您应该编写以下内容:

var els = document.getElementById("my_id").getElementsByTagName("*");
for (var i = 0;i < els.length;i++)
{
    alert(i+","+els.item(i));
}
于 2010-03-24T18:44:45.057 回答
1

除了枚举对象的属性之外,不要for..in用于任何其他事情(除非您喜欢惊喜!)只需对数组和节点列表使用简单的 for 循环。

于 2010-03-24T18:46:22.527 回答
1

这是我迭代列表的方式。这样,您就不必在循环中编写额外的行,例如var el = els[i].

var els = document.getElementById("my_id").getElementsByTagName("*");
for (var i=0, el; el=els[i]; i++) {
    // do what you like here
}
于 2010-03-24T18:47:28.240 回答
0

除非您为 s 定义自己的迭代器,否则不会NodeList,它仅适用于 JavaScript (Mozilla)。[这是我为我的 js-iterators 存储库创建的一个实现]。

于 2010-03-24T19:52:11.843 回答
0

将对象(如节点列表、参数对象或自定义对象)转换为其成员数组的方法通常很有用。

Array.from= function(what){
 var L, A= [];
 if(!what) what= {};
 L= what.length;
 if(typeof L== 'number'){
  while(L) A[--L]= what[L];
  return A;
 }
 for(var p in what){
  if(what.hasOwnProperty(p)) A[A.length]= what[p];
 }
 return A;
}

var N=Array.from(document.getElementById("my_id").getElementsByTagName("*"))
while(N.length){
tem=N.shift();
}
于 2010-03-24T20:01:06.483 回答