0

ブックマークレットを作成していますが、IE8 で奇妙な動作に遭遇しました。問題の原因となっているコードは次のとおりです。

var els = document.getElementById("my_id").getElementsByTagName("*");
for(var i in els)
{
    alert(i+","+els[i])
}

最初に警告されるのは「長さ、n」です。これは chrome では当てはまりません: IE8 だけです。

興味深いことに、コードがコンソール/アドレス バーに配置されるか、ページ自体に配置されるかによって、動作が異なるようです。

これは標準的な動作ですか?

編集:

私がそれを実行しているWebサイトにも当てはまりません。IEでキーが設定されgetElementsByTagNameた配列を返すことは可能ですか? "length"確かに、純粋な配列は返されません。

4

6 に答える 6

3

得られるのは配列ではなく、nodeList です。ここを参照して、リンク「getElementsByTagName('element_name')」をクリックします。

さらに、 for..in は、とにかく配列を反復処理するために使用することを意図していません。使用する

var item;
for (var idx=0, len=arr.length; idx<len; ++idx) {
  item = arr[idx];
  // whatever
}

配列の反復用。

ノードリストの場合、要素を取得できます

list.item(idx); // where list is what you got from getElementsByTagName

あなたがそれを「正しく」したいのなら。

于 2010-03-24T18:42:04.780 に答える
2

IE の動作は正しいです。for .. inオブジェクトのすべてのメンバー名を反復処理するため、あらゆる種類の奇妙なものが返される可能性があります。

getElementsByTagNamea を返します。aNodeListのプロパティはDOM 標準NodeListで指定されています: and 。ほとんどの JavaScript 実装では、.lengthitem(i)[i]

したがって、次のように記述する必要があります。

var els = document.getElementById("my_id").getElementsByTagName("*");
for (var i = 0;i < els.length;i++)
{
    alert(i+","+els.item(i));
}
于 2010-03-24T18:44:45.057 に答える
1

リストを反復処理する方法は次のとおりです。このようにすると、ループ内にvar el = els[i].

var els = document.getElementById("my_id").getElementsByTagName("*");
for (var i=0, el; el=els[i]; i++) {
    // do what you like here
}
于 2010-03-24T18:47:28.240 に答える
1

for..inオブジェクトのプロパティを列挙する以外には for を使用しないでください(びっくりしたくない限り!) 配列とノードリストには単純な for ループを使用してください。

于 2010-03-24T18:46:22.527 に答える
0

NodeListJavaScript (Mozilla) 専用の s の独自のイテレータを定義しない限り、そうではありません。[これが実装です] js-iterators リポジトリ用に作成したものの 1 つです。

于 2010-03-24T19:52:11.843 に答える
0

ノード リスト、引数オブジェクト、カスタム オブジェクトなどのオブジェクトをそのメンバーの配列に変換するメソッドが役立つことがよくあります。

Array.from= function(what){
 var L, A= [];
 if(!what) what= {};
 L= what.length;
 if(typeof L== 'number'){
  while(L) A[--L]= what[L];
  return A;
 }
 for(var p in what){
  if(what.hasOwnProperty(p)) A[A.length]= what[p];
 }
 return A;
}

var N=Array.from(document.getElementById("my_id").getElementsByTagName("*"))
while(N.length){
tem=N.shift();
}
于 2010-03-24T20:01:06.483 に答える