web-dev-qa-db-ja.com

JavaScript NodeList

document.getElementsByTagNameの2回の呼び出しによって返される2つのNodeListを結合する方法はありますか?

たとえば、次のコードがあります

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

結果をループしたいと思います。 1つのループで可能ですか?

前もって感謝します!

27
Dasha Salo

同じ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);
46
Simon

それらを結合することはできませんが、次のように1つのループで順番にループすることができます。

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

または、jQueryを使用して、それらすべてを一度に選択することもできます。

$('input, select')
20
Mario Menger
document.querySelectorAll("input, select"); 
12
Yansky

私の知る限り、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変数には、2セットのノードの和集合が含まれます。

4
Noldorin
_function mergeNodeLists(a, b) {
  var slice = Array.prototype.slice;
  return slice.call(a).concat(slice.call(b));
}
_

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

2
yckart

ブックマークレットの私のショートコード:

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)... }
1
user1727984

私はこれを一緒に投げました。すべてのループに対してifおよび。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
}
1
Mike K.

私の方法を試してください:

 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]);
                }
0
Nadeem

Array.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');
0
Martin Zvarík

まず、次のように、Array.prototypeを使用して配列を連結することが可能だと思いました。

Array.prototype.concat.call(selects, inputs);

しかし、それは機能しないので、ノードコレクションから配列を作成して連結しました。そのように見えます:

(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'));
    }

})();
0

今日、私は間違いなく以下を使用します:

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+(実験を有効にした場合)

let elements = document.querySelectorAll('a');

for (let i = 0, element; (element = elements[i]); i++) {
    console.log(element);
}

「element = elements [i]」は「elements.length」よりも優先されます。理由は次のとおりです。

「ノードリストは、多くの場合、フィルター付きのノードイテレーターとして実装されます。これは、長さなどのプロパティの取得がO(n)であり、長さを再確認してリストを反復処理するとO(n ^ 2)になることを意味します。」

O(1)を覚えている限り、配列アクセスとは異なります。

詳細:

0
Artur Beljajev