为什么NodeList [0]和node = NodeList [0]的行为有所不同?

时间:2012-08-20 08:29:23

标签: javascript xml dom

在以下代码摘录中,products是一个xml节点列表,其结构为:

<products>
  <product>
    <id>1</id>
    <name>item1</name>
  </product>
  <product>
    <id>2</id>
    <name>item2</name>
  </product>
</products>



xml = httpRequest.responseXML
products = xml.getElementsByTagName('products')


products[0].constructor
//=>ElementConstructor

product = products[0]
//=><product>…</product>

product.constructor
//=>ElementConstructor

product.getElementsByTagName('id')
//[ <id>1</id> ]

for(product in products){product.getElementsByTagName('id')}
//=>TypeError: 'undefined' is not a function (evaluating 'product.getElementsByTagName('id')')

如何迭代<product>元素中的每个<products>元素,并仅选择标记

3 个答案:

答案 0 :(得分:3)

您的问题标题不代表问题。可以迭代NodeList,就好像它是一个数组:

for(var i = 0; i < products.length; i++) {
  var product = products[i];
  // ...
}

你正在进行for in循环。 product然后引用密钥(即01,...),而不是getElementsByTagName

答案 1 :(得分:2)

用于迭代索引。你想要

products[product].getElementByTagName('id')

答案 2 :(得分:2)

for(product in products)

  • 遍历对象的所有可枚举属性,而不仅仅是具有属性名称数字的属性
  • 为您提供属性名称,而不是值

此代码:

var products = document.getElementsByTagName('body');
for(product in products) { console.log(product); }

给出:

0
length
item

如果要遍历元素,则需要使用常规for循环。

for (var i = 0; i < products.length; i++) {
    var product = products[i];
    // do something with product
}