Domanda

Ho del codice per farlo:

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

Funziona bene in FF e Chrome ma non in IE7. Presumibilmente perché getElementsByName non funziona in IE. Qual è la soluzione migliore?

È stato utile?

Soluzione

Nel caso in cui non si sappia perché non funziona in IE, ecco la documentazione MSDN su quella funzione :

  

Quando si utilizza il metodo getElementsByName, vengono restituiti tutti gli elementi nel documento che hanno l'attributo NAME o il valore dell'attributo ID specificati.

     

Gli elementi che supportano sia l'attributo NAME sia l'attributo ID sono inclusi nella raccolta restituita dal metodo getElementsByName, ma gli elementi con un expando NAME non sono inclusi nella raccolta; pertanto, questo metodo non può essere utilizzato per recuperare tag personalizzati per nome.

Firefox consente getElementsByName () per recuperare elementi che utilizzano un expando NAME, motivo per cui funziona. Che sia o meno una buona cosa & # 8482; potrebbe essere in discussione, ma questa è la realtà.

Quindi, un'opzione è usare getAttribute () metodo DOM per richiedere l'attributo NAME e quindi testare il valore per vedere se è quello che vuoi e, in tal caso, aggiungerlo a un array. Ciò richiederebbe tuttavia che tu esegua l'iterazione su tutti i nodi della pagina o almeno all'interno di una sottosezione, che non sarebbe la più efficiente. È possibile limitare preventivamente tale elenco utilizzando qualcosa come getElementsByTagName () forse.

Un altro modo per farlo, se hai il controllo dell'HTML della pagina, è quello di dare a tutti gli elementi di interesse un ID che varia solo in base al numero, ad esempio:

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

E quindi JavaScript come questo:

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

Questo è un hack, ovviamente, ma farebbe il lavoro che ti serve e non sarebbe troppo inefficiente rispetto ad altri hack.

Se stai usando un framework / toolkit JavaScript di qualche tipo, le tue opzioni sono molto migliori, ma non ho tempo di entrare in quelle specifiche a meno che tu non indichi che ne stai usando una. Personalmente, non so come le persone vivono senza una, risparmiano così tanto tempo, fatica e frustrazione che non puoi permetterti di non usarne una.

Altri suggerimenti

Ci sono un paio di problemi:

  1. IE sta davvero confondendo id = " " con name=""
  2. name = " " non è consentito su <span>

Per risolvere, suggerisco:

  1. Cambia tutto il name = " " in class=""
  2. Modifica il codice in questo modo:

-

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

Non è molto comune trovare elementi usando la proprietà NAME. Consiglio di passare alla proprietà ID.

Puoi comunque trovare elementi con un nome specifico usando jQuery:

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

questo restituirà tutti gli elementi con il nome dato.

getElementsByName è supportato in IE, ma ci sono bug. In particolare restituisce elementi il ??cui & # 8216; id & # 8217; corrisponda al valore dato, così come & # 8216; nome & # 8217 ;. Non riesco a capire se questo è il problema che stai riscontrando senza un po 'più di contesto, codice e messaggi di errore reali.

In generale, getElementsByName è probabilmente meglio evitarlo, perché il & # 8216; nome & # 8217; L'attributo in HTML ha diversi scopi sovrapposti che possono confondere. L'uso di getElementById è molto più affidabile. Quando lavori specificatamente con i campi modulo, puoi utilizzare in modo più affidabile form.elements [nome] per recuperare i campi che stai cercando.

Ho avuto successo usando un wrapper per restituire una matrice di elementi. Funziona con IE 6 e 7. Tieni presente che non è esattamente la stessa cosa di document.getElementsByName al 100%, poiché non è un NodeList. Ma per quello che mi serve, ovvero eseguire un ciclo for su una matrice di elementi per fare cose semplici come l'impostazione .disabled = true, funziona abbastanza bene.

Anche se questa funzione utilizza ancora getElementsByName, funziona se utilizzata in questo modo. Guarda tu stesso.

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

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

  return a;
}

Soluzione

                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]);
                    }
                }
            }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top