Concat は、通常の数値配列と文字列配列では機能しますが、オブジェクト配列では機能しません。
実際にはそうですが、NodeList
インスタンスにはconcat
メソッドArray#concat
がなく、それらをフラット化したいことを識別する手段がありません (配列ではないため)。
しかし、それでもかなり簡単です(ただし、以下の警告を参照してください)。この行を変更します。
var allTags = allInputs.concat(allSelects);
に
var allTags = [];
allTags.push.apply(allTags, allInputs);
allTags.push.apply(allTags, allSelects);
実例| ソース
これはちょっとしたトリックを使用して機能します:Array#push
配列に追加する可変数の要素を受け入れ、(この場合は) に指定さFunction#apply
れた値と任意の配列のようなオブジェクトを引数として使用して関数を呼び出します。 . インスタンスは配列に似ているため、リストのすべての要素を喜んで配列にプッシュします。this
allTags
NodeList
push
のこの動作Function#apply
(2 番目の引数が実際に配列である必要はない) は、仕様で非常に明確に定義されており、最新のブラウザーで十分にサポートされています。
悲しいことに、IE6 と 7 は上記をサポートしていません (特にホスト オブジェクトを使用していると思います — NodeLists
—Function#apply
の 2 番目の引数に) 。:-) IE8 もそうではありません。これはより問題です。IE9 は満足しています。
IE8 以前をサポートする必要がある場合は、悲しいことに、退屈な古いループで立ち往生していると思います。
var allInputs = document.getElementsByTagName('input');
var allSelects = document.getElementsByTagName('select');
var allTags = [];
appendAll(allTags, allInputs);
appendAll(allTags, allSelects);
function appendAll(dest, src) {
var n;
for (n = 0; n < src.length; ++n) {
dest.push(src[n]);
}
return dest;
}
実例| ソース
それはIE8以前(およびその他)で機能します。