的毗連的作品與普通的數字和字符串數組但不與對象數組。
事實上,確實如此,但NodeList
情況下,沒有一個concat
方法,並Array#concat
沒有確定要扁平化的(因爲他們不是陣列)的一種手段。
但它仍然很容易做(請參閱下面的警告,雖然)。改變這一行:
var allTags = allInputs.concat(allSelects);
到
var allTags = [];
allTags.push.apply(allTags, allInputs);
allTags.push.apply(allTags, allSelects);
Live Example | Source
即通過使用比特特技的工作原理:Array#push
接受可變數目的元素添加到陣列中,和Function#apply
使用this
給定值調用函數(在我們的情況下,allTags
)和任何基於陣列像對象作爲傳遞給它的參數。由於NodeList
實例是類似數組的,push
愉快地將列表的所有元素推送到數組上。
的Function#apply
(不需要的第二個參數確實是一個數組)這種現象是非常在說明書中清楚地定義,並且在現代瀏覽器很好的支持。
可悲的是,IE6和7不支持以上(我認爲這是專門使用主機對象 — NodeLists
—爲Function#apply
的第二個參數),但後來,我們不應該支持他們,無論是。 :-) 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;
}
Live Example | Source
確實在IE8及更早版本(及其他)上工作。
這不是數組其陣列狀物體(節點列表) – salexch
據,實際上的NodeList,並且因此不具有concat方法。 – THEtheChad