"Матрица.прототип.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
не является экземпляром