JavaScript节点列表
是否有方法加入由2次调用document.getElementsByTagName返回的2个节点列表 我有以下代码JavaScript节点列表,javascript,dom,concat,nodelist,Javascript,Dom,Concat,Nodelist,是否有方法加入由2次调用document.getElementsByTagName返回的2个节点列表 我有以下代码 var inputs = documentElement.getElementsByTagName('input'); var selects = document.getElementsByTagName('select'); 我想循环查看结果。在一个循环中可能吗 提前谢谢你 据我所知,NodeList类型是不可变的(参见示例),这意味着您必须生成自己的对象 一个简单的方法就是
var inputs = documentElement.getElementsByTagName('input');
var selects = document.getElementsByTagName('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];
var inputs=documentElement.getElementsByTagName('input');
var selects=document.getElementsByTagName('select');
var all=新数组(inputs.length+selects.length);
var指数=0;
对于(i=0;i
然后,
all
变量包含两组节点的并集。首先,我认为可以使用Array.prototype连接数组,如下所示:
Array.prototype.concat.call(selects, inputs);
for ( var i = 0; i < inputs.length + selects.length; i++ ) {
var element = ( i < inputs.length ) ? inputs[i] : selects[i-inputs.length];
}
但它不起作用,所以我从节点集合中创建了一个数组,并对其进行了concat。看起来是这样的:
(function () {
var inputs = document.getElementsByTagName('input'),
selects = document.getElementsByTagName('select'),
result,
i,
node;
function convert (collection) {
var a = [];
for (var i = 0, length = collection.length; i < length; i++) {
a.push(collection[i]);
}
return a;
}
// concatenation && convertation
result = Array.prototype.concat(convert(inputs), convert(selects));
// traversing
i = result.length;
while(node = result[--i]) {
alert(node.getAttribute('name'));
}
})();
(函数(){
var inputs=document.getElementsByTagName('input'),
selects=document.getElementsByTagName('select'),
结果,,
我
节点;
函数转换(集合){
var a=[];
for(var i=0,length=collection.length;i
您不能加入它们,但仍然可以在一个循环中按顺序循环它们,如下所示:
Array.prototype.concat.call(selects, inputs);
for ( var i = 0; i < inputs.length + selects.length; i++ ) {
var element = ( i < inputs.length ) ? inputs[i] : selects[i-inputs.length];
}
似乎可以使用相同的Array.prototype.slice.call使类似args数组的对象成为数组。()
我把这个拼凑起来的。为每个循环执行if and.length可能会有一点开销,但我认为这很小,除非元素的数量达到极限
inputs = div.getElementsByTagName('input');
selects = div.getElementsByTagName('select');
for (i=0; i<inputs.length+selects.length; i++) {
element = (i<inputs.length ? inputs[i] : selects[i-inputs.length]);
// do whatever with element
}
inputs=div.getElementsByTagName('input');
selects=div.getElementsByTagName('select');
对于(i=0;i我的bookmarklet短代码:
var e, t = d.getElementsByTagName('textarea'), u = d.getElementsByTagName('input'), i = t.length;
while(e = (i > 0) ? t[--i] : u[-i--]){ if(e.offsetHeight > 0)... }
console.log(合并节点列表(输入,选择));//=>[输入,选择]
现在我肯定会使用以下方法:
Chrome、Firefox 3.5+、IE8+
var elements = document.querySelectorAll('a');
for (var i = 0, element; (element = elements[i]); i++) {
console.log(element);
}
IE11+、Firefox 24+、Chrome 30+(已启用实验)
“element=elements[i]”优先于“elements.length”,因为:
节点列表通常被实现为带有筛选器的节点迭代器。这意味着获取像length这样的属性是O(n),通过重新检查长度对列表进行迭代将是O(n^2)
不像我记忆中的数组访问,它是O(1)
更多详情:
数组.prototype.slice.call()在IE 7中失败,请使用以下方法:
Object.prototype.getMyElements = function(tags){
tags = tags.split(',');
var i, j, col=[], ci=0;
for(i=0; i<tags.length; i++) {
var objs = this.getElementsByTagName(tags[i]);
for(j=0; j<objs.length; j++) col[ci++] = objs[j];
}
return col;
}
var objs = document.getMyElements('INPUT,TEXTAREA');
var objs = document.getElementById('myform').getMyElements('INPUT,TEXTAREA');
Object.prototype.getMyElements=函数(标记){
tags=tags.split(',');
变量i,j,col=[],ci=0;
对于(i=0;i尝试我的方式:
var allES = [];
var inputs = document.getElementsByTagName("input");
for (i = 0; i < inputs.length; i++) {
allES.push(inputs[i]);
}
// gather SELECT elements
var selects = document.getElementsByTagName("select");
for ( i=0; i < selects.length; i++){
allES.push(selects[i]);
}
var allES=[];
var inputs=document.getElementsByTagName(“输入”);
对于(i=0;i
同时或按顺序循环它们?我相信第一个技巧适用于除IE以外的任何(主要)浏览器。而第一个技巧在基于WebKit的浏览器(safari、chrome)上不起作用无论如何,它需要两个循环。对于我的特定任务,我只需要在结果中循环一次,因此创建一个对象是不值得的。我不能加入结果,这就是我想知道的,谢谢!是的,无论如何,在我看来,使用两个循环是最清晰的解决方案。(我考虑了一个循环选项,但它并没有真正起到帮助。)很高兴您有了一个解决方案。那么,Array.prototype.slice.call(thatNodeListOfYours,0);?我正要说:)+1 Prototype和其他库使用slice将节点列表转换为数组。需要记住的一点是,这在Internet Explorer或BlackBerry浏览器中不起作用。jQuery 1.4有一个有趣的测试,用于返回循环以合并节点列表。我在这里摘录了它:需要FF 3.1+、Safari 3.1+或IE8+
let elements = document.querySelectorAll('a');
for (let i = 0, element; (element = elements[i]); i++) {
console.log(element);
}
Object.prototype.getMyElements = function(tags){
tags = tags.split(',');
var i, j, col=[], ci=0;
for(i=0; i<tags.length; i++) {
var objs = this.getElementsByTagName(tags[i]);
for(j=0; j<objs.length; j++) col[ci++] = objs[j];
}
return col;
}
var objs = document.getMyElements('INPUT,TEXTAREA');
var objs = document.getElementById('myform').getMyElements('INPUT,TEXTAREA');
var allES = [];
var inputs = document.getElementsByTagName("input");
for (i = 0; i < inputs.length; i++) {
allES.push(inputs[i]);
}
// gather SELECT elements
var selects = document.getElementsByTagName("select");
for ( i=0; i < selects.length; i++){
allES.push(selects[i]);
}