组合getElementsByWhatever返回的数组

时间:2012-03-01 19:29:26

标签: javascript arrays concat getelementsbytagname

我试图获取特定div中的所有表单元素,并使用数组concat()方法将它们组合成单个数组:

var div_id = 'some_div_id'; // in real life this is passed as a function parameter

var child_inputs = document.getElementById(div_id).getElementsByTagName('input');
var child_textareas = document.getElementById(div_id).getElementsByTagName('textarea');
var child_selects = document.getElementById(div_id).getElementsByTagName('select');

var field_elements = child_inputs.concat(child_textareas, child_selects); // this doesnt work?

然而,脚本在最后一行失败,我不知道为什么。我不能使用.childNodes,因为传递的div_id不是直接父级。

2 个答案:

答案 0 :(得分:4)

getElementsByTagName会返回NodeList而不是数组,因此您无法使用concat

如果要将nodeList“转换”为数组,可以从Array原型链中调用slice:

var div_id = 'some_div_id',
    divIdElement = document.getElementById(div_id); //cache the element

var getArrayFromTag = function(tagname) {
     //get the NodeList and transform it into an array
     return Array.prototype.slice.call(divIdElement.getElementsByTagName(tagname));
}

//Get the arrays
var child_inputs = getArrayFromTag('input');
var child_textareas = getArrayFromTag ('textarea');
var child_selects = getArrayFromTag ('select');

//use concat
var field_elements = child_inputs.concat(child_textareas, child_selects);

答案 1 :(得分:1)

这些方法不会返回数组。相反,它是NodeListHTMLCollection。 (见the note under Syntax.

你可以loop over each nodelist并手工制作一组数组'。