有没有办法加入由2次document.getElementsByTagName调用返回的2个NodeLists?
说,我有以下代码
var inputs = documentElement.getElementsByTagName('input');
var selects = document.getElementsByTagName('select');
我想遍历结果。可以在一个循环中吗?
先感谢您!
有没有办法加入由2次document.getElementsByTagName调用返回的2个NodeLists?
说,我有以下代码
var inputs = documentElement.getElementsByTagName('input');
var selects = document.getElementsByTagName('select');
我想遍历结果。可以在一个循环中吗?
先感谢您!
似乎您可以使用相同的 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);
你不能加入它们,但你仍然可以像这样在一个循环中按顺序循环它们:
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");
据我所知,该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
然后该变量包含两组节点的并集。
function mergeNodeLists(a, b) {
var slice = Array.prototype.slice;
return slice.call(a).concat(slice.call(b));
}
console.log( mergeNodeLists( inputs, selects ) ); // => [input, select]