JavaScript 节点列表

IT技术 javascript dom concat nodelist
2021-02-16 18:26:51

有没有办法加入由2次document.getElementsByTagName调用返回的2个NodeLists?

说,我有以下代码

var inputs = documentElement.getElementsByTagName('input');
var selects = document.getElementsByTagName('select');

我想遍历结果。可以在一个循环中吗?

先感谢您!

6个回答

似乎您可以使用相同的 Array.prototype.slice.call 使 args 类数组对象成为数组。见这里

var inputs = document.getElementsByTagName('input');
var selects = document.getElementsByTagName('select');

inputs = Array.prototype.slice.call(inputs);
selects = Array.prototype.slice.call(selects);

var res = inputs.concat(selects);

alert(res.length);
需要记住的一点是,这在 Internet Explorer 或 BlackBerry 浏览器中不起作用。jQuery 1.4 有一个有趣的测试,用于回退到循环以组合节点列表。我在这里摘录了它:pastebin.com/TkTwMG17
2021-04-25 18:26:51
我正要说:) +1 Prototype 和其他库使用 slice 将节点列表转换为数组。
2021-05-10 18:26:51

你不能加入它们,但你仍然可以像这样在一个循环中按顺序循环它们:

for ( var i = 0; i < inputs.length + selects.length; i++ ) {
    var element = ( i < inputs.length ) ? inputs[i] : selects[i-inputs.length];
}

或者,使用 jQuery,您可以一次性选择它们:

$('input, select')
document.querySelectorAll("input, select"); 
需要 FF 3.1+、Safari 3.1+ 或 IE8+
2021-04-16 18:26:51

据我所知,该NodeList类型是不可变的(例如,请参阅本文),这意味着您必须生成自己的对象。

一个简单的方法就是创建一个数组并将所有元素复制到该数组中。

var inputs = documentElement.getElementsByTagName('input');
var selects = document.getElementsByTagName('select');
var all = new Array(inputs.length + selects.length);

var index = 0;
for (i = 0; i < inputs.length; i++)
    all[index++] = inputs[i];
for (i = 0; i < selects.length; i++)
    all[index++] = selects[i];

all然后变量包含两组节点的并集。

是的,无论如何,在我看来,使用两个循环是最清晰的解决方案。(我考虑了单循环选项,但它并没有真正帮助事情。)很高兴你有一个解决方案。
2021-04-16 18:26:51
无论如何它都需要2个循环。对于我的特定任务,我只需要遍历结果一次,因此创建对象是不值得的。我无法加入结果,这就是我想知道的,谢谢!
2021-05-06 18:26:51
好。那么 Array.prototype.slice.call(thatNodeListOfYours, 0); ?
2021-05-12 18:26:51
function mergeNodeLists(a, b) {
  var slice = Array.prototype.slice;
  return slice.call(a).concat(slice.call(b));
}

console.log( mergeNodeLists( inputs, selects ) ); // => [input, select]