Вопрос по javascript, internet-explorer, object-expected – [function] .apply () вызывая ошибку «Ожидается объект JScript» в IE

4

Следующая строка кода вызывает «ожидаемый объект 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).
Я просто изменил код наhideElements(elements)и изменил функциюhideElements так что если первый аргумент является массивом, он проходит через него; в противном случае он перебирает аргументы. Axel
Я не думаю, что IE нравитсяwindow быть обработанным как обычный объект JS, но я могу ошибаться. Pointy
Спасибо, Эрик, отсюда и проблема. К сожалению, преобразование коллекции в массив не хуже, чем в моем случае. Я думаю, мой единственный выбор - использовать другой подход. Заставляет задуматься, почему это хорошо работает с FF и Chrome, хотя ... Не стесняйтесь опубликовать ответ, и я его приму. Axel
Я не уверен, что HTMLCollection совместима с массивом (он работает), вы пытались сделать копию в фактическом[] массив первый? Eric
Вы также можете использоватьcall вместоapply а затем иметьhideElements функция обрабатыватьelements коллекция. & quot; Вызывает функцию с заданным значением и аргументами, предоставляемыми индивидуально. & quot; Stefan

Ваш Ответ

1   ответ
7

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)); должно сработать.

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

Похожие вопросы