"Матрица.прототип.slice:" это "не является объектом JavaScript" ошибка в IE8

насколько я понимаю, IE8 имеет доступ к Array.prototype.slice метод. Но когда я пытаюсь вызвать его, чтобы превратить NodeList в массив, это дает мне ошибку Array.prototype.slice: 'this' is not a JavaScript object. можно посмотреть здесь, или посмотрите на мой код:

HTML-код

<div id="test">Test</div>

JavaScript

var divs = document.getElementsByTagName('div');
divs = Array.prototype.slice.call(divs);
console.log(divs);

что здесь происходит?

4 ответов


Обновление: A NodeList можно рассматривать как массив в некотором роде - вам на самом деле не нужно делать с ним ничего особенного, прежде чем вы сможете его обойти, например:

var aDivs = [];
for (var = i = 0; i < divs.length; i++) {
    aDivs.push(divs[i]);
}

Это создаст массив со всеми узлами, которые совпадают при запуске document.getElementsByTagName()

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

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


сообщение об ошибке является точным - ваш nodelist не является объектом JavaScript, это "Хост-Объекта", которые вы не можете обязательно передавать как обычные объекты JavaScript. Запустите этот код в консоли JavaScript IE8:

document.querySelectorAll("div") instanceof Object

возвращает false.


Я предполагаю, что вы хотите сохранить тот же контент, даже если набор NodeList изменяется.

Если это так, плохие новости: IE8 сломан. И он не может справиться с использованием slice в NodeList.

поэтому вам нужно будет использовать резервный вариант и сделать "срез" самостоятельно, когда срез терпит неудачу (используя try/catch).

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

[edit] на самом деле это не сломанный дизайн, это разрешено стандартом (как указано по ссылке в комментарии Келвина Маккея)


используя Array.prototype.slice преобразование NodeList массив не будет работать из-за этих двух причин:

  • slice метод возвращает существующие элементы массива.

  • Array.prototype не является экземпляром