У меня есть функция JavaScript, которая принимает список узлов HTML, но это ожидает массив JavaScript (это выполняет некоторые методы Массива на том), и я хочу подать его вывод Document.getElementsByTagName
это возвращает список узла DOM.
Первоначально я думал об использовании чего-то простого как:
Array.prototype.slice.call(list,0)
И это хорошо работает во всех браузерах, кроме, конечно, Internet Explorer, который возвращает ошибку "объект JScript, ожидаемый", как по-видимому, список узла DOM, возвращенный Document.getElement*
методы не являются достаточно объектом JScript быть целью вызова функции.
Протесты: Я не возражаю писать Internet Explorer определенный код, но мне не разрешают пользоваться никакими библиотеками Javascript, такими как JQuery, потому что я пишу виджет, который будет встроен в сторонний веб-сайт, и я не могу загрузить внешние библиотеки, которые создадут конфликт для клиентов.
Мое последнее усилие состоит в том, чтобы выполнить итерации по узлу DOM, перечисляют и создают массив самостоятельно, но есть ли более хороший способ сделать это?
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
изначально , поэтому, если вы работаете в современной среде, вы можете использовать его напрямую или заполнить его.
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));
}
}
Это должно сработать, кроссбраузерность и доступ ко всем узлам "элемента".