Краткий обзор списков узлов и того, как они работают

Краткий обзор списков узлов и того, как они работают

21 октября 2022 г.

Знаете ли вы, что Javascript не классифицирует набор нескольких элементов как массив? Вместо этого это то, что называется NodeList. Список узлов — это, по сути, список элементов. Чтобы сгенерировать NodeList, мы можем сделать что-то вроде этого:

let myNodeList = document.querySelectorAll('p');

Приведенный выше код вернет список всех абзацев, найденных на странице, в виде NodeList.

Списки узлов интересны тем, что они не являются массивами, поэтому они не наследуют все различные функции, которыми обладают массивы. Одним из примечательных примеров является то, что в некоторых старых браузерах, таких как Internet Explorer, NodeList не наследуют функцию forEach.

Таким образом, если вы хотите добавить прослушиватель событий к каждому абзацу, следующий код вызовет ошибку в Internet Explorer:

let myNodeList = document.querySelectorAll('p');

myNodeList.forEach(function(item) {
    item.addEventListener('click', function(e) {
        // Do some click events
    });
    // For each node item..
});

Поскольку это работает в большинстве современных браузеров, вам обычно не нужно беспокоиться об этом, но если вы хотите поддерживать старые браузеры и использовать forEach, мы должны поместить наш NodeList в массив, например так:

Чтобы преобразовать наш NodeList в более управляемый массив, мы можем использовать следующий код:

let myNodeList = document.querySelectorAll('p');
Array.prototype.forEach.call(myNodeList, function(item) {
    item.addEventListener('click', function(e) {
        // Do some click events
    });
    // For each node item..
});

Немного сложно, но теперь мы можем гарантировать, что все наши пользователи смогут получить доступ к прослушивателям событий, которые мы добавляем к нашим элементам NodeList.

Какие функции поддерживаются NodeLists?

Поскольку в этой статье до сих пор основное внимание уделялось тому, что NodeList не всегда имел forEach по умолчанию, вам может быть интересно, какие функции можно запускать в NodeList. Их 4:

* NodeList.entries — возвращает итератор для получения как идентификатора, так и элемента в виде пары идентификатор/элемент, т. е. [ 1, p ]. * NodeList.forEach — для перебора каждого элемента по отдельности. * NodeList.item - для получения определенного элемента по id, т.е. получить первый абзац по NodeList.item(0). * NodeList.keys - возвращает итератор для получения ключей, т.е. 1 2 3 4 5 ... * NodeList.values — возвращает итератор для получения элементов HTML, т.е. pp p p p ...

Стоит отметить, что NodeList.item — единственная функция, поддерживаемая Internet Explorer. Остальные нет.

В качестве примера, вот как мы будем запускать эти функции в нашем NodeList:

NodeList.entries

let myNodeList = document.querySelectorAll('p');

// entries
let allEntries = myNodeList.entries();
for(var i of allEntries) {
    // Console logs each paragraph with an id individually, such as [ 0, p ] [ 1, p ] [ 2, p ] ...
    console.log(i);
}

Список узлов.для каждого

let myNodeList = document.querySelectorAll('p');

// forEach - iterate over each item
myNodeList.forEach(function(item) {
    // Console logs each paragraph element individually
    console.log(i);
});

NodeList.item

let myNodeList = document.querySelectorAll('p');

// item - get the first element (0)
let firstElement = myNodeList.item(0);
// Console logs the first element only
console.log(firstElement);

NodeList.keys

let myNodeList = document.querySelectorAll('p');

let getKeys = myNodeList.keys();
// Console logs the id of each element, i.e. 1 2 3 4 5 ...
for(var i of getKeys) {
    console.log(i);
}

NodeList.values

let myNodeList = document.querySelectorAll('p');

let getValues = myNodeList.values();
// Console logs each HTML element as an array, i.e. p p p p ...

for(var i of getValues) {
    console.log(i);
}

Также опубликовано здесь


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE