DOM方法document.querySelectorAll()
(以及其他一些方法)返回NodeList
。
要对列表进行操作(例如使用)forEach()
,NodeList
必须首先将转换为Array
。
将转换为的最佳方法NodeList
是Array
什么?
DOM方法document.querySelectorAll()
(以及其他一些方法)返回NodeList
。
要对列表进行操作(例如使用)forEach()
,NodeList
必须首先将转换为Array
。
将转换为的最佳方法NodeList
是Array
什么?
Answers:
使用ES6,您可以简单地执行以下操作:
const spanList = [...document.querySelectorAll("span")];
Type 'NodeListOf<Element>' must have a '[Symbol.iterator]()' method that returns an iterator.ts(2488)
使用ES6,您可以使用Array.from(myNodeList)
。然后使用您喜欢的数组方法。
var myNodeList = document.querySelectorAll('.my-selector');
// ALT 1
Array.from(myNodeList).forEach(function(el) {
console.log(el);
});
使用ES6填充程序也可以在较旧的浏览器中实现此功能。
如果您使用的是Transpiler(例如Babel),则还有两种选择:
var myNodeList = document.querySelectorAll('.my-selector');
// ALT 2
for (var el of myNodeList) {
el.classList.add('active'); // or some other action
}
// ALT 3
[...myNodeList].forEach((el) => {
console.log(el);
});
Array.from(myNodeList)
它,因为它可以填充垫片。
您可以使用原型中的slice
方法将其转换为数组Array
:
var elList = document.querySelectorAll('.viewcount');
elList = Array.prototype.slice.call(elList, 0);
此外,如果您需要的只是forEach
,则可以从原型中调用它Array
,而无需先将其强制转换为数组:
var elList = document.querySelectorAll('.viewcount');
Array.prototype.forEach.call(elList, function(el) {
console.log(el);
});
在ES6中,可以使用新Array.from
函数将其转换为数组:
Array.from(elList).forEach(function(el) {
console.log(el);
});
当前仅在最先进的浏览器中使用,但是如果您使用的是polyfill服务,则可以全面使用此功能。
如果您使用的是ES6转译器,则甚至可以使用for..of
循环:
for (var element of document.querySelectorAll('.some .elements')) {
// use element here
}
Array.prototype.forEach
而不是的原因[].forEach
是因为后者创建了一个新的Array对象,这完全没有必要。
[]
吗?我的想法是,它将收集垃圾并且对内存的影响可以忽略不计,有人对此发表评论吗?
为什么要转换?-仅call
在元素集合上直接使用Array的功能;)
[].forEach.call( $('a'), function( v, i) {
// do something
});
当然,假设$是您的querySelectorAll别名
编辑:ES6允许使用更短的语法[...$('a')]
(仅适用于Firefox,截至2014年5月)
$
是querySelectorAll
。
function $ ( s ) { return document.querySelectorAll(s); }
。
$('a').each(function(i, v) {...});
一定要forEach
吗?您可以简单地使用for
循环遍历列表:
for (var i = 0; i < elementList.length; i++) {
doSomethingWith(elementlist.item(i));
}
elementList.item(i)
您可以使用代替elementList[i]
。
forEach()
更好的编程风格和较少的冗长-ymmv
for (var oElement, i = 0; oElement = aMenuItemsElements; i++ { console.log(oElement); }
for (var i…)
循环,因为for循环不会创建自己的作用域(就像现在在C / C ++中那样)。然后i
弄混了。
较旧的浏览器可以使用下面的polyfill。
要对JavaScript中的列表进行操作(例如使用forEach()),必须将NodeList转换为Array。
这不是真的。.forEach()
在当前的浏览器中工作。如果缺少它,则可以将.forEach()从Array添加到NodeList,它可以正常工作:
if ( ! NodeList.prototype.forEach ) {
NodeList.prototype.forEach = Array.prototype.forEach;
}
您现在可以运行:
myNodeList.forEach(function(node){...})
像数组一样遍历NodeList。
这比到处的.call()生成的代码更短,更简洁。
forEach
专门添加的,我是来这里找的filter
filter
,但是NodeList.prototype.dbkFilter
如果您担心将来会使用其他实现标准,则可以使用一个非正式名称或类似名称。
在ES6中与我合作
假设您有这样的节点列表
<ul>
<li data-time="5:17">Flexbox video</li>
<li data-time="8:22">Flexbox video</li>
<li data-time="3:24">Redux video</li>
<li data-time="5:17">Flexbox video</li>
<li data-time="7:17">Flexbox video</li>
<li data-time="4:17">Flexbox video</li>
<li data-time="2:17">Redux video</li>
<li data-time="7:17">Flexbox video</li>
<li data-time="9:54">Flexbox video</li>
<li data-time="5:53">Flexbox video</li>
<li data-time="7:32">Flexbox video</li>
<li data-time="2:47">Redux video</li>
<li data-time="9:17">Flexbox video</li>
</ul>
const items = Array.from(document.querySelectorAll('[data-time]'));
console.log(items);
好吧,这对我也适用:
const elements = Object.values( document.querySelector(your selector here) )
Object.values()
返回Array
给定对象的值。NodeList
是对象,就像JS中的一切一样。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/values
但是它与IE不兼容,所以我认为这Array.prototype.*array_method*.call(yourNodeList)
是最好的选择。有了这个,你可以调用你的任何数组方法NodeList
假设elems是一个nodeList:
var elems = document.querySelectorAll('select option:checked');
然后可以将其转换为数组,如下所示:
var values = [].map.call(elems, function(obj) {
return obj.value;
});
参考:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Example : _using_map_generically_querySelectorAll