17

私はこれを行ういくつかのコードを持っています:

 var changes = document.getElementsByName(from);
 for (var c=0; c<changes.length; c++) {
   var ch = changes[c];
   var current = new String(ch.innerHTML);
   etc.
 }

これは FF と Chrome では正常に機能しますが、IE7 では機能しません。おそらく、getElementsByName が IE で機能していないためです。最善の回避策は何ですか?

4

7 に答える 7

17

これが IE で機能しない理由がわからない場合は、その機能に関する MSDN ドキュメントを次に示します

getElementsByName メソッドを使用すると、指定された NAME 属性または ID 属性値を持つドキュメント内のすべての要素が返されます。

NAME 属性と ID 属性の両方をサポートする要素は、getElementsByName メソッドによって返されるコレクションに含まれますが、NAME expando を持つ要素はコレクションに含まれません。したがって、このメソッドを使用してカスタム タグを名前で取得することはできません。

Firefox ではgetElementsByName()、NAME expando を使用する要素を取得できます。これが機能する理由です。それがGood Thing™であるかどうかは議論の余地があるかもしれませんが、それが現実です.

したがって、1 つのオプションは、getAttribute()DOM メソッドを使用して NAME 属性を要求し、値をテストして目的の値であるかどうかを確認し、必要な場合は配列に追加することです。ただし、これには、ページ内または少なくともサブセクション内のすべてのノードを反復処理する必要があり、これは最も効率的ではありません。getElementsByTagName()おそらく次のようなものを使用して、そのリストを事前に制約できます。

これを行う別の方法として、ページの HTML を制御している場合は、関心のあるすべての要素に番号のみが異なる Id を与える方法があります。次に例を示します。

<div id="Change0">...</div>
<div id="Change1">...</div>
<div id="Change2">...</div>
<div id="Change3">...</div>

次に、JavaScript を次のようにします。

// assumes consecutive numbering, starting at 0
function getElementsByModifiedId(baseIdentifier) {
    var allWantedElements = [];
    var idMod = 0;
    while(document.getElementById(baseIdentifier + idMod)) { // will stop when it can't find any more
        allWantedElements.push(document.getElementById(baseIdentifier + idMod++));
    }
    return allWantedElements;
}

// call it like so:
var changes = getElementsByModifiedId("Change");

もちろん、これはハックですが、必要な仕事をしてくれるし、他のハックに比べて効率が悪いわけではありません。

なんらかの JavaScript フレームワーク/ツールキットを使用している場合、オプションははるかに優れていますが、使用していることを示さない限り、それらの詳細に入る時間はありません。個人的には、人々がそれなしでどのように生活しているかはわかりません。時間、労力、フラストレーションを大幅に節約できるので、使用しないわけにはいきません。

于 2008-11-10T18:48:20.850 に答える
4

いくつかの問題があります。

  1. IEは確かに混乱id=""していますname=""
  2. name=""は許可されていません<span>

修正するには、次のことをお勧めします。

  1. すべてname=""をに変更class=""
  2. コードを次のように変更します。

-

var changes = document.getElementById('text').getElementsByTagName('span');
for (var c=0; c<changes.length; c++) {
 var ch = changes[c];

 if (ch.className != from)
continue;

 var current = new String(ch.innerHTML);
于 2008-11-10T18:33:07.260 に答える
2

NAME プロパティを使用して要素を検索することはあまり一般的ではありません。ID プロパティに切り替えることをお勧めします。

ただし、jQuery を使用して特定の名前の要素を見つけることができます。

 $("*[name='whatevernameYouWant']");

これは、指定された名前を持つすべての要素を返します。

于 2008-11-10T18:57:53.013 に答える
1

IEのもう1つのDOMバグ:

バグ1:ここをクリック

バグ2:ここをクリック

于 2008-11-10T22:54:09.340 に答える
1

ラッパーを使用して要素の配列を返すことに成功しました。IE 6 および 7 でも動作します。これは NodeList ではないため、document.getElementsByName と 100% まったく同じではないことに注意してください。しかし、要素の配列に対して for ループを実行して、.disabled = true の設定などの単純なことを行うために必要な場合は、十分に機能します。

この関数は引き続き getElementsByName を使用しますが、このように使用すると機能します。自分で見て。

function getElementsByNameWrapper(name) {
  a = new Array();

  for (var i = 0; i < document.getElementsByName(name).length; ++i) {
    a.push(document.getElementsByName(name)[i]);
  }

  return a;
}
于 2013-07-19T16:06:22.320 に答える
1

getElementsByName は IE でサポートされていますが、バグがあります。特に、「id」が指定された値と「name」に一致する要素を返します。ただし、もう少しコンテキスト、コード、および実際のエラーメッセージがなければ、それが問題であるかどうかはわかりません。

一般に、getElementsByName はおそらく避けるのが最善です。これは、HTML の「name」属性にはいくつかの重複する目的があり、混乱を招く可能性があるためです。getElementById を使用すると、はるかに信頼性が高くなります。特にフォーム フィールドを操作する場合は、より確実に form.elements[name] を使用して、探しているフィールドを取得できます。

于 2008-11-10T18:43:39.517 に答える