Как JavaScript хранит элементы DOM в переменных?
Я имею в виду, как JavaScript хранит элементы DOM, когда вы делаете что-то вроде:
var foo = document.getElementsByTagName('p');
чем становится фу? массив объектов? и как я могу добавить больше элементов к этой переменной, например:
var bar = document.form[0].getElementsByTagName('input'); // 5 elements
var foo = document.form[1].getElementsByTagName('input'); // 4 elements
bar =+ foo;
for (i=0;i<bar.length;i++){
console.log(bar.value); // 9 logged values
}
можно ли добавить больше элементов одного и того же типа в переменную, в которой уже есть элементы? Должен ли я перебирать все элементы в переменной, которую я хочу добавить, и "нажимать" их в переменной, в которой я хочу все данные?
3 ответов
getElementsByTagName
(и аналогичные методы, такие как getElementsByName
, getElementsByClassName
и т. д.) возвращает NodeList
(или HTMLCollection
в зависимости от браузера, видимо, см. Также разница между HTMLCollection, NodeLists и массивами объектов).
даже если это массив-как объект, т. е. он имеет числовые свойства и .length
свойство, вы не можете добавлять к нему новые элементы.
для того, чтобы измените NodeList
, вы должны преобразовать его в обычный массив. Это может быть легко достигнуто с помощью метода array .slice
и в то же время вы можете объединить оба списка с .concat
:
bar = Array.prototype.slice.call(bar).concat(Array.prototype.slice(foo));
это работает, потому что большинство собственных методов массива определяется таким образом, что аргумент не должен быть на самом деле массив, а массив-как объект.
примечательные различия между a NodeList
и окончательного выбора являются:
- массив больше не живет, т. е. коллекция не обновляется автоматически при добавлении новых узлов DOM.
- элементы в конечном (объединенном) массиве не обязательно будут в порядке документа.
bar =+ foo;
это работает только для конкатенации строк и было бы bar+= foo
но и bar и foo здесь являются объектами DOM. так что если вы хотите добавить элементы того же типа, вы можете создать массив.
например,
var myArray =[]
myArray.push(foo);
myArray.push(bar);
foo становится функцией. Поэтому вы не сможете добавить foo в bar, потому что это не имеет смысла. Это все равно что пытаться сделать:--2-->
document.form[0].getElementsByName('input') document.form[1].getElementsByName('input');
вы можете иметь несколько элементов в одном массиве. Я бы нашел, что это самый простой способ достичь вашего решения.