2012-03-01 3 views
3

Я пытаюсь получить все элементы формы в пределах определенного DIV, и объединить их в единый массив с помощью CONCAT массива() метод:Комбинирование массивы, возвращаемые getElementsByWhatever

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 не является прямым родителем.

+0

массив структур должны быть одинаковыми для использования CONCAT. Эти селекторы элементов дают результаты, которых нет. Это не простые списки - это объекты. –

+0

Кроме того, см. Это http://stackoverflow.com/questions/2735067/how-to-convert-a-dom-node-list-to-an-array-in-javascript –

+0

Также смотрите: [http: // stackoverflow.com/questions/914783/javascript-nodelist](http://stackoverflow.com/questions/914783/javascript-nodelist) – wave

ответ

4

getElementsByTagName возвращает NodeList не массив, поэтому вы не можете использовать concat.

Если вы хотите, чтобы «превратить» Нодлист в массив можно назвать фрагмент из массива ProType цепи:

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);