Javascript 的“for in”应该是这样吗?构造迭代长度属性?

发布于 2024-08-26 23:43:03 字数 433 浏览 5 评论 0原文

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

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

首先发出警报的是“length, n”。在 chrome 中并非如此:仅在 IE8 中如此。

有趣的是,它的行为似乎有所不同,具体取决于代码是否位于控制台/地址栏或页面本身。

这是标准行为吗?

编辑:

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

I'm making a bookmarklet, but I've encountered some wierd behaviour in IE8. The code causing the problem is this:

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

The first thing that is alerted is "length, n". This isn't the case in chrome: just in IE8.

Interestingly, it seems to behave differently depending on whether the code goes in the console/address bar or the page itself.

Is this standard behaviour?

EDIT:

Not down to the website that I run it on either. Is it possible that getElementsByTagName returns an array with a "length" key set in IE? It certainly doesn't return a pure array.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

痕至 2024-09-02 23:43:04

这是我迭代列表的方法。这样,您就不必在循环中编写额外的行,例如 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
}

Here's how I iterate over lists. This way, you won't have to write an extra line in the loop, such as 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
}
老子叫无熙 2024-09-02 23:43:04

除非您为 NodeList 定义自己的迭代器(仅限 JavaScript (Mozilla))。 [这是我为 js-iterators 存储库创建的一个实现]。

Not unless you define your own iterator for NodeLists, which is JavaScript (Mozilla)-only. [Here's an implementation] of one I have created for my js-iterators repo.

无边思念无边月 2024-09-02 23:43:04

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

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();
}

A method to convert an object, like a node list, arguments object, or custom object to an array of its members is often useful.

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();
}
情深如许 2024-09-02 23:43:03

你得到的不是一个数组,而是一个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

对于节点列表,如果您想“正确”地执行操作,则

What you get is not an array, it is a nodeList.
See here, click the link "getElementsByTagName('element_name')"

Furthermore, for..in is not meant to be used for iterating over an array anyway. Use

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

for array iteration.

For a nodelist, you can get the element with

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

if you want to do it "right".

贩梦商人 2024-09-02 23:43:03

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

getElementsByTagName 返回一个 NodeList,并且 NodeList 的属性在 DOM 标准长度 和 <代码>项目(i)。大多数 JavaScript 实现也允许 [i]

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

var els = document.getElementById("my_id").getElementsByTagName("*");
for (var i = 0;i < els.length;i++)
{
    alert(i+","+els.item(i));
}

The IE behavior is correct. It may return all kinds of weird stuff, since for .. in iterates over all member names of the object.

getElementsByTagName returns a NodeList, and the properties of a NodeList are specified in the DOM standard: length and item(i). Most JavaScript implementations will also allow [i].

Therefore, you should write the following:

var els = document.getElementById("my_id").getElementsByTagName("*");
for (var i = 0;i < els.length;i++)
{
    alert(i+","+els.item(i));
}
伴随着你 2024-09-02 23:43:03

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

Do not use for..in for anything other than enumerating properties of an object (unless you like surprises!) Just use a simple for loop for arrays and nodelists.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文