为了获得匹配的元素&循环,我正在使用querySelectorAll
& forEach
数组方法。根据{{3}},querySelectorAll
将返回nodelist
。
我也可以通过获取匹配的元素来使用getElementsByClassName
,但不能直接使用forEach
。但是this链接告诉我们它还返回一个nodelist对象
在forEach
返回时使用getElementsByClassName
会引发错误,forEach is not a function
您能告诉我为什么forEach
在getElementsByClassName
&返回时getElementsByClassName
无法直接返回querySelectorAll
。 nodelist
为select customers.customerId, items.itemName, sum(orders.quantity) as boughtTotal
from customers join orders on customers.customerId = orders.customerId
join items on items.itemId = orders.itemId
group by customers.customerId, items.itemName
order by boughtTotal desc;
答案 0 :(得分:2)
document.querySelectorAll
会返回NodeList
而不是Array
。永远不要害怕,等等!
您可以使用Function.prototype.call更改Array.prototype.forEach
功能的上下文。
var nodes = document.querySelectorAll('span');
var colors = ['red', 'orange', 'gold', 'lawngreen', 'dodgerblue', 'deepskyblue', 'blueviolet'];
Array.prototype.forEach.call(nodes, function(elem, idx) {
// do something
elem.style.color = colors[idx];
});

<span>A</span>
<span>B</span>
<span>C</span>
<span>D</span>
<span>E</span>
<span>F</span>
<span>G</span>
&#13;
修改强>
实际上我怀疑
forEach
不能直接用于返回document.getElementsByClassName
这是因为document.getElementsByClassName
会使HTMLCollection
而不是Array
。 HTMLCollection
在其原型上没有forEach
方法。
var nodes = document.getElementsByTagName('span');
console.log(nodes.constructor.name);
//=> HTMLCollection
&#13;
<span>A</span>
&#13;
答案 1 :(得分:1)
从我测试的内容:
<ul>
<li class="test"></li>
<li class="test"></li>
<li class="test"></li>
<li class="test"></li>
<li class="test"></li>
<li class="test"></li>
<li class="test"></li>
</ul>
<script type="text/javascript">
var elementList = document.querySelectorAll("li");
console.log(elementList.constructor);
var elementList2 = document.getElementsByClassName("test");
console.log(elementList2);
console.log(elementList2.constructor);
</script>
querySelectorAll
返回:
NodeList() { [native code] }
而getElementsByClassName
返回:
HTMLCollection() { [native code] }
与前面的回答一样,HTML集合无法访问forEach方法。
EDIT1:Difference between HTMLCollection, NodeLists, and arrays of objects似乎回答了一些差异!
EDIT2:您似乎可以使用此处提到的ES6技术迭代HTML集合:For loop for HTMLCollection elements
答案 2 :(得分:0)
我们可以通过许多其他方式与HTML集合进行交互,就好像它是一个数组一样。我们可以使用索引号访问数据。它看起来像一个数组。但是它的功能有些不同。首先,有一点区别。我听说nodeList和HTMLCollection可以互换使用。它们都是DOM列表,但是唯一的真正区别是HTMLCollection更具体。它包含相同的DOM元素,而nodeList可以包含各种DOM元素。这就是为什么querySelectorAll返回nodeList但getElementsByTagName返回HTMLCollection的原因。有趣的是,forEach可以在nodeList上工作,而不能在HTMLCollection上工作。
现在有多种方法可以遍历HTMLCollection;
var p = document.getElementsByTagName("p") for(var i = 0; i < p.length; i++) { console.log(p)}
在此处https://medium.com/@larry.sassainsworth/iterating-over-an-html-collection-in-javascript-5071f58fad6b