Concat साधारण संख्यात्मक और स्ट्रिंग सरणियों के साथ काम करता है लेकिन वस्तु सरणियों के साथ ऐसा नहीं करता।
वास्तव में, यह होता है, लेकिन 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
) और किसी भी array- ऑब्जेक्ट की तरह तर्कों को पास करने के लिए। चूंकि NodeList
उदाहरण सरणी की तरह हैं, push
खुशी से सरणी पर सूची के सभी तत्वों को धक्का देता है।
Function#apply
(वास्तव में एक श्रृंखला होना चाहिए दूसरा तर्क की जरूरत नहीं) के इस व्यवहार बहुत स्पष्ट रूप से विनिर्देश में परिभाषित है, और आधुनिक ब्राउज़रों में अच्छी तरह से समर्थित है।
दुख की बात है, IE6 और 7 से ऊपर का समर्थन नहीं करते हैं, लेकिन फिर, हम उन्हें नहीं समर्थन किया जाना चाहिए, या तो (मैं इसे विशेष रूप से उपयोग कर रहा है मेजबान वस्तुओं — NodeLists
— Function#apply
के दूसरे तर्क के लिए लगता है) । :-) IE8, या तो, जो अधिक समस्याग्रस्त नहीं है। आईई 9 इसके साथ खुश है।
आप 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 और पहले (और अन्य) पर काम करता है।
इस सरणी वस्तु की तरह अपने सरणी (NodeList) – salexch
यह है, वास्तव में, एक NodeList, और इसलिए concat विधि नहीं है नहीं है। सहायता के लिए – THEtheChad