Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript节点列表_Javascript_Dom_Concat_Nodelist - Fatal编程技术网

JavaScript节点列表

JavaScript节点列表,javascript,dom,concat,nodelist,Javascript,Dom,Concat,Nodelist,是否有方法加入由2次调用document.getElementsByTagName返回的2个节点列表 我有以下代码 var inputs = documentElement.getElementsByTagName('input'); var selects = document.getElementsByTagName('select'); 我想循环查看结果。在一个循环中可能吗 提前谢谢你 据我所知,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');
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]);
                }