[function] .apply () вызывая ошибку «Ожидается объект JScript» в IE

Следующая строка кода вызывает «ожидаемый объект JScript» ошибка в IE:

hideElements.apply(window, elements);

Согласно IE «ожидаемый объект JScript» относится кhideElements, которая является функцией, которая принимает любое количество объектов HTML в качестве аргументов и скрывает их.

Конкретно, я получаю массив объектов HTML с помощью вызоваgetElementsByTagNameи я хотел бы передать этот массив в виде списка аргументов функцииhideElements, Функция JSapply() это именно то, что мне нужно в этом случае. Я знаю, что мог бы написать свой код по-разному, но, поскольку он отлично работает на Firefox и Chrome и технически корректен, мне бы очень хотелось узнать, почему IE застревает там.

Я определил, что при выполнении строки:

window is not null and of type Window; elements is not null and of type HTMLCollection; and hideElements is a fully functional JS function (that works perfectly on its own and that is fully loaded when the code above is executed).
 Pointy20 июн. 2012 г., 06:49
Я не думаю, что IE нравитсяwindow быть обработанным как обычный объект JS, но я могу ошибаться.
 Eric20 июн. 2012 г., 07:00
Я не уверен, что HTMLCollection совместима с массивом (он работает), вы пытались сделать копию в фактическом[] массив первый?
 Axel20 июн. 2012 г., 07:21
Спасибо, Эрик, отсюда и проблема. К сожалению, преобразование коллекции в массив не хуже, чем в моем случае. Я думаю, мой единственный выбор - использовать другой подход. Заставляет задуматься, почему это хорошо работает с FF и Chrome, хотя ... Не стесняйтесь опубликовать ответ, и я его приму.
 Axel20 июн. 2012 г., 08:19
Я просто изменил код наhideElements(elements)и изменил функциюhideElements так что если первый аргумент является массивом, он проходит через него; в противном случае он перебирает аргументы.
 Stefan20 июн. 2012 г., 08:14
Вы также можете использоватьcall вместоapply а затем иметьhideElements функция обрабатыватьelements коллекция. & quot; Вызывает функцию с заданным значением и аргументами, предоставляемыми индивидуально. & quot;

Ответы на вопрос(1)

Решение Вопроса

getElementsByTagName возвращаетnodeList. apply ожидает, что второй аргумент будетarray, Если вы конвертируетеelements к реальному массиву (используя цикл), он должен работать.

Примечание: в IE & lt; 9 его невозможно использоватьArray.prototype.slice.call(elements) для этого цикл является самым безопасным способом создания массива, например:

function nodeList2Array(nodes){
  var arr = [];
  for (var i=1; i<nodes.length;(i+=1)){
    arr.push(nodes[i]);
  }
  return arr;
}

сейчас:hideElements.apply(window, nodeList2Array(elements)); должно сработать.

 26 сент. 2014 г., 23:09
@Dancrumb в IE & lt; 9NodeList не считаетсяjavascript объект. Увидетьnfriedly.com/techblog/2009/06/…
 20 июн. 2012 г., 07:57
@MrBlaster: да, это стиль Крокфорда. Немного яснее, что происходит со мной таким образом.
 20 июн. 2012 г., 07:55
+1. Любая конкретная причина(i+=1) Крокфордский стиль или какая-то другая причина?
 26 сент. 2014 г., 18:03
Интересно ... я бы предположил, чтоarguments является приемлемым значением для передачиapply... но это тоже не массив ... любая идея, почему это нормально, ноNodeList не является?

Ваш ответ на вопрос