Frage

Ich habe einige Code, um dies zu tun:

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

Dies funktioniert in FF und Chrome, aber nicht in IE7. Vermutlich weil getElementsByName nicht in IE arbeiten. Was ist die beste Abhilfe?

War es hilfreich?

Lösung

Falls Sie nicht wissen, warum dies nicht in IE funktioniert, hier ist die MSDN-Dokumentation auf diese Funktion :

  

Wenn Sie die getElementsByName Methode verwenden, werden alle Elemente in dem Dokument, das das angegebene Attribut NAME oder ID-Attributwert haben, werden zurückgegeben.

     

Elemente, die sowohl das Namen-Attribut und das ID-Attribut unterstützt in der Sammlung durch die getElementsByName Methode, aber Elemente mit einem Namen expando zurück enthalten sind, werden nicht in der Sammlung enthalten ist; Daher kann dieses Verfahren nicht verwendet werden, um benutzerdefinierte Tags durch den Namen.

Firefox ermöglicht getElementsByName() Elemente abzurufen, verwenden sie einen Namen expando, weshalb es funktioniert. Unabhängig davon, ob das ist eine gute Sache ™ zur Debatte sein kann, aber das ist die Realität davon.

Also, eine Option ist die getAttribute() DOM-Methode für das NAME-Attribut zu stellen und dann den Wert testen, um zu sehen, ob es ist, was Sie wollen, und wenn ja, fügen Sie ihn in ein Array. Dies würde erfordern, jedoch, dass Sie alle Knoten in der Seite iterieren oder zumindest in einem Teilabschnitt, der nicht die effizienteste wäre. Man könnte diese Liste beschränkt zuvor durch etwas mit wie getElementsByTagName() vielleicht.

Eine andere Möglichkeit, dies zu tun, wenn Sie die Kontrolle über den HTML-Code der Seite sind, ist alle Elemente von Interesse eine Id zu geben, die nur durch die Anzahl variiert, z.

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

Und dann haben Sie JavaScript wie folgt:

// 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");

Das ist ein Hack, natürlich, aber es wäre zu tun, um die Arbeit, die Sie brauchen, und nicht zu ineffizient zu einigen anderen Hacks zu vergleichen.

Wenn Sie einen JavaScript-Framework / Toolkit irgendeiner Art verwenden, sind Sie Optionen viel besser, aber ich habe keine Zeit in diese Besonderheiten zu erhalten, es sei denn Sie zeigen Sie verwenden ein. Ich persönlich weiß nicht, wie die Menschen leben, ohne ein, sie sparen so viel Zeit, Mühe und Frustration, die Sie sich nicht leisten können nicht zu verwenden.

Andere Tipps

Es gibt ein paar Probleme:

  1. IE ist in der Tat verwirrend id="" mit name=""
  2. name="" nicht auf <span> erlaubt

Um dies zu beheben, schlage ich vor:

  1. Ändern Sie alle name="" class=""
  2. Ändern Sie den Code wie folgt:

-

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);

Es ist nicht sehr häufig Elemente Eigenschaft mit dem Namen zu finden. Ich würde empfehlen, auf die ID-Eigenschaft wechseln.

Sie können jedoch Elemente mit einem bestimmten Namen finden mit jQuery:

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

Dadurch werden alle Elemente mit dem angegebenen Namen zurück.

getElementsByName wird in IE unterstützt wird, aber es gibt Bugs. Insbesondere gibt es Elemente, deren ‚id‘ den angegebenen Wert entsprechen, sowie ‚name‘. Kann nicht sagen, ob das ist das Problem ohne ein bisschen mehr Kontext die Sie haben, Code und tatsächliche Fehlermeldungen though.

Im Allgemeinen getElementsByName ist wahrscheinlich am besten vermieden werden, weil das ‚name‘ Attribut in HTML mehr überlappende Zwecke hat, die verwirren kann. getElementById verwenden ist viel zuverlässiger. Wenn speziell mit Formularfeldern arbeiten, können Sie zuverlässiger form.elements [name] verwenden, um die Felder abrufen, die Sie suchen.

Ich habe Erfolg mit einem Wrapper habe eine Anordnung der Elemente zurückzukehren. Arbeitet in IE 6 und 7. auch. es nicht 100% ist genau die gleiche wie document.getElementsByName, da es kein NodeList ist im Auge behalten. Aber für das, was ich brauche es für, das ist nur ein auf einem Array von Elementen für Schleife läuft einfache Dinge wie = true .disabled Einstellung, es funktioniert gut genug.

Auch wenn diese Funktion getElementsByName noch verwendet, funktioniert es, wenn auf diese Weise verwendet wird. Überzeugen Sie sich selbst.

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

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

  return a;
}

Umgehung

                var listOfElements = document.getElementsByName('aName'); // Replace aName with the name you're looking for
            // IE hack, because it doesn't properly support getElementsByName
            if (listOfElements.length == 0) { // If IE, which hasn't returned any elements
                var listOfElements = [];
                var spanList = document.getElementsByTagName('*'); // If all the elements are the same type of tag, enter it here (e.g.: SPAN)
                for(var i = 0; i < spanList.length; i++) {
                    if(spanList[i].getAttribute('name') == 'aName') {
                        listOfElements.push(spanList[i]);
                    }
                }
            }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top