Wie kann ich ALLE DOM-Elemente auf einer Seite durchlaufen?

Lesezeit: 6 Minuten

Wie kann ich ALLE DOM Elemente auf einer Seite durchlaufen
Florian Müller

Ich versuche, ALLE Elemente auf einer Seite zu durchlaufen, also möchte ich jedes Element, das auf dieser Seite existiert, auf eine spezielle Klasse überprüfen.

Wie sage ich also, dass ich JEDES Element überprüfen möchte?

  • Sind Sie sicher, dass Sie jedes Element selbst durchlaufen möchten? Warum nicht jquery und Selektoren verwenden, um Elemente dieser bestimmten Klasse zu erfassen?

    – N.G.

    23. November 2010 um 13:18 Uhr

  • Gibt es keine document.getElementsByTagName-Methode?

    – SuperJedi224

    5. Mai 2015 um 19:59 Uhr

  • *TL;DR: Verwenden Sie für nur sichtbare Elemente: document.body.getElementsByTagName('*')

    – Andreas

    1. April 2020 um 17:05 Uhr

  • Iterieren mit: for (... of ...) { }

    – Andreas

    1. April 2020 um 17:10 Uhr

  • Ich benutzte: Array.from(document.querySelectorAll('*')).forEach(el => {})

    – Jaja

    31. August 2020 um 13:39 Uhr


Wie kann ich ALLE DOM Elemente auf einer Seite durchlaufen
Andi E

Sie können eine passieren * zu getElementsByTagName() damit es alle Elemente auf einer Seite zurückgibt:

var all = document.getElementsByTagName("*");

for (var i=0, max=all.length; i < max; i++) {
     // Do something with the element here
}

Beachten Sie, dass Sie verwenden könnten querySelectorAll()falls verfügbar (IE9+, CSS in IE8), um nur Elemente mit einer bestimmten Klasse zu finden.

if (document.querySelectorAll)
    var clsElements = document.querySelectorAll(".mySpeshalClass");
else
    // loop through all elements instead

Dies würde die Sache für moderne Browser sicherlich beschleunigen.


Browser unterstützen jetzt foreach auf NodeList. Das bedeutet, dass Sie die Elemente direkt Schleifen können, anstatt eine eigene for-Schleife zu schreiben.

document.querySelectorAll('*').forEach(function(node) {
    // Do whatever you want with the node object.
});

Leistungshinweis – Geben Sie Ihr Bestes, um das Gesuchte einzugrenzen, indem Sie einen bestimmten Selektor verwenden. Ein universeller Selektor kann je nach Komplexität der Seite viele Knoten zurückgeben. Erwägen Sie auch die Verwendung document.body.querySelectorAll anstatt document.querySelectorAll wenn es dir egal ist <head> Kinder.

  • Diese Methode scheint sehr nett zu sein, aber wie kann ich ein Element in der oberen Methode auswählen? Ich habe nur den Index ‘i’?

    – Florian Müller

    23. November 2010 um 13:35 Uhr

  • @Florian: Genauso wie Sie auf ein Array-Element zugreifen würden — all[i] würde Ihnen das aktuelle Element geben.

    – Andi E

    23. November 2010 um 13:36 Uhr

  • Wie wähle ich das Element in der Schleife aus?

    – Debiprasad

    19. April 2013 um 13:39 Uhr

  • @JesseAldridge: nur eine Macht der Gewohnheit/guten Praxis. Das Vermeiden der Eigenschaftssuche bei jeder Iteration ist normalerweise eine Mikrooptimierung, aber es ist nicht besonders schwierig zu schreiben, und deshalb mache ich es einfach auf natürliche Weise.

    – Andi E

    23. März 2015 um 9:04 Uhr

  • @Jonathan getElementsByClassName() hat schlechtere Unterstützung als querySelectorAll() (Ersteres wird in IE 8 nicht unterstützt). Das OP hat klar gesagt, dass er eine Schleife machen möchte alle Elemente auf einer Seite, für die ich ihm die Lösung gab und eine Alternative anbot. Ich bin mir nicht sicher, was das Problem damit ist ;-).

    – Andi E

    6. Oktober 2015 um 15:55 Uhr

1645703117 986 Wie kann ich ALLE DOM Elemente auf einer Seite durchlaufen
traditionell

Habe das gleiche gesucht. Nun, nicht genau. Ich wollte nur alle DOM Nodes auflisten.

var currentNode,
    ni = document.createNodeIterator(document.documentElement, NodeFilter.SHOW_ELEMENT);

while(currentNode = ni.nextNode()) {
    console.log(currentNode.nodeName);
}

Um Elemente mit einer bestimmten Klasse zu erhalten, können wir die Filterfunktion verwenden.

var currentNode,
    ni = document.createNodeIterator(
                     document.documentElement, 
                     NodeFilter.SHOW_ELEMENT,
                     function(node){
                         return node.classList.contains('toggleable') ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
                     }
         );

while(currentNode = ni.nextNode()) {
    console.log(currentNode.nodeName);
}

Lösung gefunden auf
MDN

  • habe document.ceeateNodeIterator nie gesehen. Scheint interessant zu sein, welche neuen Funktionen JS bringt 😉

    – Florian Müller

    3. Oktober 2014 um 10:03 Uhr

  • Ein cooles Feature davon ist, dass der Nodeiterator auch die Knoten in der Reihenfolge durchläuft, in der sie im HTML erscheinen. Ich frage mich, ob einige der document.body.getElementsByTagName('*') könnte die Knoten in verschlüsselter Reihenfolge zurückgeben.

    – Zivilist

    9. August 2016 um 21:55 Uhr

  • Wow, es wird tatsächlich gut unterstützt!

    – Rogerpack

    1. Mai 2020 um 5:40 Uhr

Wie kann ich ALLE DOM Elemente auf einer Seite durchlaufen
Ilja Gazman

Wie immer ist die beste Lösung die Verwendung der Rekursion:

loop(document);
function loop(node){
    // do some thing with the node here
    var nodes = node.childNodes;
    for (var i = 0; i <nodes.length; i++){
        if(!nodes[i]){
            continue;
        }

        if(nodes[i].childNodes.length > 0){
            loop(nodes[i]);
        }
    }
}

Im Gegensatz zu anderen Vorschlägen erfordert diese Lösung nicht, dass Sie ein Array für alle Knoten erstellen, sodass der Speicher weniger belastet wird. Noch wichtiger ist, dass mehr Ergebnisse gefunden werden. Ich bin mir nicht sicher, was diese Ergebnisse sind, aber beim Testen auf Chrome werden im Vergleich zu etwa 50 % mehr Knoten gefunden document.getElementsByTagName("*");

  • Die beste Zeit für die Verwendung von Rekursion ist die beste Zeit für die Verwendung von Rekursion.

    – Adamlive

    5. Oktober 2017 um 14:05 Uhr

  • „Es gründet etwa 50 % mehr Knoten im Vergleich zu document.getElementsByTagName("*");” — ja, es wird finden Textknoten und Kommentarknoten sowie Elementknoten. Da das OP nur nach Elementen gefragt hat, ist das unnötig.

    – Paul D. Waite

    2. März 2018 um 16:03 Uhr

  • Es könnte sein leichter auf Speicher. Je nachdem, wie viel Sie in jeder Rekursionsebene tun, können Sie einen mächtig großen Call-Stack aufbauen, wenn Sie den Grund erreichen. EIN NodeList bezieht sich einfach auf die Nodes, die bereits in Ihr DOM eingebaut sind, also ist es nicht so schwer, wie Sie sich vielleicht vorstellen. Jemand, der mehr weiß, kann sich einmischen, aber ich denke, es ist nur eine Speicherreferenzgröße, also 8 Bytes pro Knoten.

    – Josh aus Qaribou

    28. Juni 2018 um 21:23 Uhr

1645703119 340 Wie kann ich ALLE DOM Elemente auf einer Seite durchlaufen
Juggernogger93

Hier ist ein weiteres Beispiel, wie Sie ein Dokument oder ein Element durchlaufen können:

function getNodeList(elem){
var l=new Array(elem),c=1,ret=new Array();
//This first loop will loop until the count var is stable//
for(var r=0;r<c;r++){
    //This loop will loop thru the child element list//
    for(var z=0;z<l[r].childNodes.length;z++){

         //Push the element to the return array.
        ret.push(l[r].childNodes[z]);

        if(l[r].childNodes[z].childNodes[0]){
            l.push(l[r].childNodes[z]);c++;
        }//IF           
    }//FOR
}//FOR
return ret;
}

Für diejenigen, die Jquery verwenden

$("*").each(function(i,e){console.log(i+' '+e)});

1645703120 217 Wie kann ich ALLE DOM Elemente auf einer Seite durchlaufen
synaptik

Andy E. hat eine gute Antwort gegeben.

Ich würde hinzufügen, wenn Sie alle untergeordneten Elemente in einem speziellen Selektor auswählen möchten (dieses Bedürfnis 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 gerade gemacht

var visualDomElts = document.body.getElementsByTagName('*');

Dabei wird der Kopfteil niemals berücksichtigt.

von diesem Link
Javascript-Referenz

<html>
<head>
<title>A Simple Page</title>
<script language="JavaScript">
<!--
function findhead1()
{
    var tag, tags;
    // or you can use var allElem=document.all; and loop on it
    tags = "The tags in the page are:"
    for(i = 0; i < document.all.length; i++)
    {
        tag = document.all(i).tagName;
        tags = tags + "\r" + tag;
    }
    document.write(tags);
}

//  -->
</script>
</head>
<body onload="findhead1()">
<h1>Heading One</h1>
</body>
</html>

AKTUALISIEREN: BEARBEITEN

seit meiner letzten antwort habe ich eine bessere einfachere lösung gefunden

function search(tableEvent)
    {
        clearResults()

        document.getElementById('loading').style.display = 'block';

        var params="formAction=SearchStocks";

        var elemArray = document.mainForm.elements;
        for (var i = 0; i < elemArray.length;i++)
        {
            var element = elemArray[i];

            var elementName= element.name;
            if(elementName=='formAction')
                continue;
            params += '&' + elementName+'='+ encodeURIComponent(element.value);

        }

        params += '&tableEvent=" + tableEvent;


        createXmlHttpObject();

        sendRequestPost(http_request,"Controller',false,params);

        prepareUpdateTableContents();//function js to handle the response out of scope for this question

    }

  • laut dieser SO-Diskussion, document.all wird zugunsten von entmutigt document.getElementBy*.

    – thejoshwolfe

    6. April 2013 um 18:29 Uhr

  • @thejoshwolfe danke, was hältst du von meiner zweiten Lösung, die ich aktualisiert habe

    – Shareef

    7. April 2013 um 6:04 Uhr

842790cookie-checkWie kann ich ALLE DOM-Elemente auf einer Seite durchlaufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy