Frage

Ich mache ein Bookmarklet, aber ich habe einige seltsame Verhalten in IE8 angetroffen. Der Code verursacht das Problem ist folgendes:

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

Das erste, was alarmiert wird, ist „Länge, n“. Dies ist nicht der Fall in Chrom. Nur in IE8

Interessanterweise scheint es anders zu verhalten, je nachdem, ob der Code ging in der Konsole / Adressleiste oder der Seite selbst.

Ist das Standardverhalten?

EDIT:

Nicht nach unten auf die Webseite, dass ich es auf entweder laufen. Ist es möglich, dass getElementsByTagName ein Array mit einem "length" Schlüsselsatz im IE zurückkehrt? Es ist sicherlich kein reines Array zurück.

War es hilfreich?

Lösung

Was man bekommt, ist kein Array, es ist ein nodeList ist. Siehe hier , klicken Sie auf den Link "getElementsByTagName ( 'element_name')"

Darüber hinaus ist for..in nicht ohnehin zur Iteration über einen Array verwendet werden soll. Mit

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

für Array-Iteration.

Für eine Nodelist, können Sie das Element erhalten mit

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

, wenn Sie wollen, es zu tun "rechts".

Andere Tipps

Die IE Verhalten korrekt ist. Es kann alle Arten von seltsamen Sachen zurückgeben, da for .. in iteriert über alle Mitgliedsnamen des Objekts.

getElementsByTagName kehrt ein NodeList , und die Eigenschaften eines NodeList sind in der DOM-Standard : length und item(i). Die meisten JavaScript-Implementierungen werden auch [i] ermöglichen.

Daher sollten Sie schreiben folgendes:

var els = document.getElementById("my_id").getElementsByTagName("*");
for (var i = 0;i < els.length;i++)
{
    alert(i+","+els.item(i));
}

Verwenden Sie for..in nicht für etwas anderes als Eigenschaften eines Objekts Aufzählen (es sei denn, Sie mögen Überraschungen!) Nur eine einfache for-Schleife für Arrays und Nodelisten.

Hier ist, wie ich Listen iterieren. Auf diese Weise werden Sie nicht eine zusätzliche Zeile in der Schleife, wie var el = els[i] zu schreiben.

var els = document.getElementById("my_id").getElementsByTagName("*");
for (var i=0, el; el=els[i]; i++) {
    // do what you like here
}

Nicht, wenn Sie Ihren eigenen Iterator für NodeLists definieren, die -nur JavaScript (Mozilla) ist. [Hier ist eine Implementierung] eines ich für meine js-Iteratoren erstellt haben Repo.

Verfahren ein Objekt, wie eine Knotenliste, Argumente Objekt oder benutzerdefiniertes Objekt auf eine Anordnung von ihren Mitgliedern zu konvertieren ist oft nützlich.

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top