Das Problem beim Umdrehen von NodeList
in JavaScript verstehen
JavaScript ist eine leistungsstarke Sprache zur Manipulation des Document Object Model (DOM) in der Webentwicklung. Viele Entwickler stoßen jedoch auf Probleme, wenn sie mit Sammlungen von DOM-Objekten arbeiten, insbesondere wenn sie versuchen, diese Sammlungen wie reguläre Arrays zu behandeln. Ein häufiges Problem besteht darin, die Methode Array.reverse()
auf Sammlungen anzuwenden, die durch DOM-Funktionen wie getElementsByTagName()
abgerufen werden. In diesem Blogbeitrag werden wir erkunden, warum dies passiert und wie man effektiv mit diesen Sammlungen arbeitet.
Der Code, der Verwirrung stiftet
Betrachten Sie den folgenden JavaScript-Codeausschnitt:
var imagesArr = new Array();
imagesArr = document.getElementById("myDivHolderId").getElementsByTagName("img");
imagesArr.reverse();
Wenn die Methode reverse()
auf imagesArr
aufgerufen wird, tritt in Browsern wie Firefox 3 ein Fehler auf, der die Nachricht ergibt:
imagesArr.reverse is not a function
Warum geschieht das?
Der entscheidende Punkt, den es zu verstehen gilt, ist die Natur der imagesArr
-Variablen, nachdem Sie ihr einen Wert zugewiesen haben. Wenn Sie getElementsByTagName()
verwenden, erhalten Sie tatsächlich eine NodeList
, kein Array. Hier ist, warum diese Unterscheidung wichtig ist:
Verständnis von NodeList
vs. Array
Was ist eine NodeList
?
- Eine
NodeList
ist eine Sammlung von Knoten, die von verschiedenen DOM-Methoden zurückgegeben werden kann. In diesem speziellen Fall gibtgetElementsByTagName("img")
alle<img>
-Elemente zurück, die unter dem angegebenen Element (in diesem Fall"myDivHolderId"
) gefunden werden. - Während eine
NodeList
durchlaufen werden kann (wie ein Array), hat sie grundlegende Unterschiede, die verhindern, dass Sie Array-Methoden wiereverse()
,map()
oderfilter()
darauf anwenden.
Wichtige Unterschiede zwischen NodeList
und Arrays
- Typ: Eine
NodeList
ist ein Objekt, während ein Array eine eingebaute Struktur in JavaScript mit speziellen Methoden ist. - Dynamische Aktualisierung: Die Elemente in einer
NodeList
können dynamisch wechseln. Wenn weitere<img>
-Tags zum DOM hinzugefügt werden, werden sie automatisch in derNodeList
berücksichtigt, während ein Array nicht automatisch aktualisiert wird, es sei denn, Sie fügen explizit neue Elemente hinzu.
Wie man eine NodeList
effektiv umkehrt
Wenn Sie die Reihenfolge einer NodeList
umkehren möchten, können Sie sie zunächst in ein Array konvertieren. So können Sie das tun:
Lösung: Konvertieren und Umkehren
- Konvertieren Sie die
NodeList
in ein Array: Sie können die MethodeArray.from()
oder den Spread-Operator verwenden, um dieNodeList
in ein Array zu konvertieren.
Verwendung von Array.from()
var imagesArr = Array.from(document.getElementById("myDivHolderId").getElementsByTagName("img"));
imagesArr.reverse(); // Jetzt können Sie sicher umkehren
Verwendung des Spread-Operators
var imagesArr = [...document.getElementById("myDivHolderId").getElementsByTagName("img")];
imagesArr.reverse(); // Ermöglicht auch die Umkehrung
Schlussgedanken
Durch das Verständnis des Unterschieds zwischen einer NodeList
und einem Array können Sie Verwirrung und Fehler in Ihrem JavaScript-Code vermeiden. Wenn Sie Array-Methoden auf eine Sammlung von DOM-Objekten anwenden möchten, denken Sie immer daran, die NodeList
zuerst in ein Array zu konvertieren.
Für weitere Informationen über die Struktur und das Verhalten von NodeList
können Sie die W3C DOM Level 2 Core-Spezifikation überprüfen.
Mit diesen Strategien wird die Arbeit mit DOM-Elementen in JavaScript viel reibungsloser und effizienter, was Ihnen mögliche Fehler und Frustrationen in der Zukunft erspart.