【发布时间】:2020-04-05 01:04:21
【问题描述】:
我正在寻找一种面向未来的方式来遍历 NodeList(即来自element.querySelectorAll(selector))以及跨浏览器兼容。以前我一直在使用 ES6 的传播功能,但是 IE 不支持传播,所以我使用了一个 shim 来代替它。我觉得这有点矫枉过正和低效。然后我遇到了黑客Array.prototype.forEach.call。它有效,但对我来说看起来很臭。
迭代 NodeList 的最佳方法是什么?
我偏爱向后兼容性和干净的代码,但如果您的答案也适用于以下任何其他标准,那将不胜感激。
- 可读性
- 面向未来
- 速度
我查看了JavaScript iterate through NodeList,其中介绍了几种方法。但是,没有可读性、兼容性等方面的问题。只要它有效。
我遇到的几种方法是:
const elems = document.querySelectorAll('img');
[].forEach.call(elems, function (o) { console.log(o) });
[...elems].foreach(function (o) { console.log(o) });
for (var i = 0; i < elems.length; i++) {
console.log(elems[i]);
}
for (var i = elems.length - 1; i >= 0; i--) {
console.log(elems[i]);
}
// User-defined
var forEach = function (array, callback, scope) {
for (var i = 0; i < array.length; i++) {
callback.call(scope, i, array[i]);
}
};
forEach(elems, function (index, value) {
console.log(index, value);
});
【问题讨论】:
-
1.大多数是可读的。这取决于您对什么感到满意。最简单的只是一个
for循环,但您也可以使用[].forEach.call,我认为这是惯用的。 2. 我不希望将来删除其中的任何,所以我不确定为什么你希望它比现在已经工作的更“面向未来”。如果它适用于 IE 和现代浏览器,它会在几年后运行。 3. 速度可能不是问题。我怀疑任何常见的方法都会使您的应用程序陷入停顿。简单的迭代很少成为瓶颈——性能问题通常在其他地方。
标签: javascript cross-browser nodelist