Как преобразовать список узла DOM в массив в JavaScript?

У меня есть функция JavaScript, которая принимает список узлов HTML, но это ожидает массив JavaScript (это выполняет некоторые методы Массива на том), и я хочу подать его вывод Document.getElementsByTagName это возвращает список узла DOM.

Первоначально я думал об использовании чего-то простого как:

Array.prototype.slice.call(list,0)

И это хорошо работает во всех браузерах, кроме, конечно, Internet Explorer, который возвращает ошибку "объект JScript, ожидаемый", как по-видимому, список узла DOM, возвращенный Document.getElement* методы не являются достаточно объектом JScript быть целью вызова функции.

Протесты: Я не возражаю писать Internet Explorer определенный код, но мне не разрешают пользоваться никакими библиотеками Javascript, такими как JQuery, потому что я пишу виджет, который будет встроен в сторонний веб-сайт, и я не могу загрузить внешние библиотеки, которые создадут конфликт для клиентов.

Мое последнее усилие состоит в том, чтобы выполнить итерации по узлу DOM, перечисляют и создают массив самостоятельно, но есть ли более хороший способ сделать это?

85
задан Guss 29 April 2010 в 05:59
поделиться

2 ответа

NodeList - это хост-объекты , использование метода Array.prototype.slice для хост-объектов не гарантируется Работа, спецификация ECMAScript гласит:

Возможность успешного применения функции среза к объекту хоста зависит от реализации.

Я бы порекомендовал вам создать простую функцию для перебора NodeList и добавления каждого существующего элемента в массив:

function toArray(obj) {
  var array = [];
  // iterate backwards ensuring that length is an UInt32
  for (var i = obj.length >>> 0; i--;) { 
    array[i] = obj[i];
  }
  return array;
}

ОБНОВЛЕНИЕ:

Как показывают другие ответы, теперь вы можете использовать в современных средах синтаксис распространения или метод Array.from :

const array = [ ...nodeList ] // or Array.from(nodeList)

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

52
ответ дан 24 November 2019 в 08:13
поделиться
var arr = new Array();
var x= ... get your nodes;

for (i=0;i<x.length;i++)
{
  if (x.item(i).nodeType==1)
  {
    arr.push(x.item(i));
  }
}

Это должно сработать, кроссбраузерность и доступ ко всем узлам "элемента".

3
ответ дан 24 November 2019 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: