4

次のコード行により、IEで「JScriptオブジェクトが必要です」というエラーが発生します。

hideElements.apply(window, elements);

IEによると、「期待されるJScriptオブジェクト」はhideElements、を参照します。これは、任意の数のHTMLオブジェクトを引数として受け取り、それらを非表示にする関数です。

具体的には、を呼び出してHTMLオブジェクトの配列を取得し、getElementsByTagNameこの配列を引数のリストとして関数に渡しますhideElements。その場合、JS関数apply()はまさに私が必要としているものです。私は確かに別の方法でコードを書くことができることを知っていますが、これはFirefoxとChromeで完全に機能し、技術的に正しいので、IEがそこでスタックする理由を本当に知りたいです。

行が実行されると、次のように判断しました。

  • windownullではなく、タイプWindow;
  • elementsnullではなく、タイプHTMLCollection; と
  • hideElementsは完全に機能するJS関数です(それ自体で完全に機能し、上記のコードが実行されると完全にロードされます)。
4

1 に答える 1

7

getElementsByTagNameを返しますnodeListapplyは、2 番目の引数が であると想定していますarrayelements(ループを使用して) 実数配列に変換すると、機能するはずです。

注: IE<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));動作するはずです。

于 2012-06-20T05:51:24.963 に答える