Конвертировать NodeList в массив - PullRequest
8 голосов
/ 30 декабря 2010

Мне трудно преобразовать NodeList в массив в IE 8. Следующее прекрасно работает в Chrome, но в IE 8 toArray() не распознается как действительное:

NodeList.prototype.toArray = function() {
    var a = [];

    for (var i = 0, len = this.length; i < len; i++) {
        a[i] = this[i];
    }

    return a;
}

document.all.tags("div").toArray();

Я попытался добавить функцию-прототип в массив, чтобы проверить мою работоспособность, и она работает правильно.Это заставляет меня думать, что IE 8 на самом деле не возвращает NodeList?Вот полный пример:

http://jsfiddle.net/e4RbH/

Что я делаю не так?

Ответы [ 4 ]

6 голосов
/ 08 октября 2017

Если вы ищете современный ответ, используя ES6:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from

var nodes = document.querySelectorAll('div');
nodes = Array.from(nodes);
4 голосов
/ 22 января 2017

Старый вопрос, но вот проверенный и верный метод:

var nodes=document.querySelectorAll("div"); //  returns a node list
nodes=Array.prototype.slice.call(nodes);    //  copies to an array

Объяснение

  • document.querySelectorAll использует селектор в стиле CSS для поиска элементов и возвращает список узлов. Работает с IE 8.
  • Метод slice копирует часть подобной массиву коллекции (в данном случае всю) в новый массив.
  • call позволяет заимствовать метод из одного объекта для использования в другом

Чтобы найти список узлов, вы также могли бы использовать `document.getElementsByTagName (), но этот более гибкий.

3 голосов
/ 30 декабря 2010

Во-первых, не используйте document.all - это нестандартно и не рекомендуется. Используйте document.getElementsByTagName, чтобы получить элементы DIV в вашем случае.

Во-вторых, не расширяйте объекты DOM, такие как NodeList - встроенные объекты очень странная порода и не должны вести себя как любые другие объекты, с которыми вы обычно работаете. См. Эту статью для подробного объяснения этого: Что не так с расширением DOM .

1 голос
/ 30 декабря 2010

IE не поддерживает NodeList стандартным способом. Вот почему вы должны свернуть свое собственное пространство имен и НЕ расширять основные объекты браузера.

Вы можете сделать alert( typeof window.NodeList ) и посмотреть, не определено ли оно или нет.

...