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?
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?
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
anstattdocument.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
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
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 Node
s, 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
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)});
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
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