Ich versuche, ALLE Elemente auf einer Seite zu durchlaufen, daher möchte ich jedes auf dieser Seite vorhandene Element auf eine spezielle Klasse überprüfen.
Wie kann ich also sagen, dass ich JEDES Element überprüfen möchte?
javascript
dom
Florian Müller
quelle
quelle
document.body.getElementsByTagName('*')
for (... of ...) { }
Antworten:
Sie können ein
*
an übergebengetElementsByTagName()
, damit alle Elemente auf einer Seite zurückgegeben werden:Beachten Sie, dass Sie
querySelectorAll()
, falls verfügbar (IE9 +, CSS in IE8), nur Elemente mit einer bestimmten Klasse suchen können.Dies würde sicherlich die Sache für moderne Browser beschleunigen.
Browser unterstützen jetzt foreach auf NodeList . Dies bedeutet, dass Sie die Elemente direkt schleifen können, anstatt Ihre eigene for-Schleife zu schreiben.
quelle
all[i]
würden - würde Ihnen das aktuelle Element geben.getElementsByClassName()
hat schlechtere Unterstützung alsquerySelectorAll()
(ersteres wird in IE 8 nicht unterstützt). Das OP erklärte klar, dass er alle Elemente auf einer Seite durchlaufen möchte , für die ich ihm die Lösung gegeben und eine Alternative angeboten habe. Ich bin mir nicht sicher, wo das Problem liegt ;-).War auf der Suche nach dem gleichen. Nun, nicht genau. Ich wollte nur alle DOM-Knoten auflisten.
Um Elemente mit einer bestimmten Klasse zu erhalten, können wir die Filterfunktion verwenden.
Gefundene Lösung auf MDN
quelle
document.body.getElementsByTagName('*')
ihnen die Knoten in verschlüsselter Reihenfolge zurückgeben könnten.Wie immer ist die beste Lösung die Verwendung der Rekursion:
Im Gegensatz zu anderen Vorschlägen müssen Sie bei dieser Lösung nicht für alle Knoten ein Array erstellen, um den Speicher besser zu beleuchten. Noch wichtiger ist, dass mehr Ergebnisse erzielt werden. Ich bin mir nicht sicher, was diese Ergebnisse sind, aber beim Testen auf Chrom werden etwa 50% mehr Knoten im Vergleich zu gefunden
document.getElementsByTagName("*");
quelle
document.getElementsByTagName("*");
" - ja, es werden Textknoten und Kommentarknoten sowie Elementknoten gefunden . Da das OP nur nach Elementen fragte, ist das unnötig.NodeList
verweist einfach auf dieNode
s, die bereits in Ihrem DOM erstellt wurden. Es ist also nicht so schwer, wie Sie sich vorstellen können. Jemand, der mehr weiß, kann wiegen, aber ich denke, es ist nur eine Speicherreferenzgröße, also 8 Bytes pro Knoten.Hier ist ein weiteres Beispiel, wie Sie ein Dokument oder ein Element durchlaufen können:
quelle
Für diejenigen, die Jquery verwenden
quelle
Andy E. gab eine gute Antwort.
Ich würde hinzufügen, wenn Sie alle Kinder in einem speziellen Selektor auswählen möchten (dies ist mir kürzlich passiert), können Sie die Methode "getElementsByTagName ()" auf jedes gewünschte DOM-Objekt anwenden.
Zum Beispiel musste ich nur den "visuellen" Teil der Webseite analysieren, also habe ich das einfach gemacht
Dies wird niemals den Kopfteil berücksichtigen.
quelle
von diesem Link
Javascript Referenz
UPDATE: BEARBEITEN
seit meiner letzten antwort habe ich eine bessere einfachere lösung gefunden
quelle
document.all
wird zugunsten entmutigtdocument.getElementBy*
.Verwenden
*
quelle
Ich denke, das ist wirklich schnell
quelle
Es ist in Ordnung, alle Elemente zu verwenden,
var all = document.getElementsByTagName("*"); for (var i=0, max=all.length; i < max; i++);
wenn Sie jedes Element überprüfen müssen, dies jedoch dazu führt, dass sich wiederholende Elemente oder Texte überprüft oder wiederholt werden.Im Folgenden finden Sie eine Rekursionsimplementierung, die jedes Element aller DOM-Elemente nur einmal überprüft oder schleift und anfügt:
(Dank an @George Reith für seine Rekursionsantwort hier: HTML zu JSON zuordnen )
quelle
Sie können mit versuchen
document.getElementsByClassName('special_class');
quelle
getElementsByClassName()
und wird von Internet Explorer bis Version 9 nicht unterstützt.