wake-up-neo.net

Wie mache ich diese Schleife alle Kinder rekursiv?

Ich habe folgendes:

for (var i = 0; i < children.length; i++){
   if(hasClass(children[i], "lbExclude")){
       children[i].parentNode.removeChild(children[i]);
   }
};

Ich möchte, dass es alle Kinder von Kindern usw. durchläuft (nicht nur die oberste Ebene). Ich habe diese Zeile gefunden, die das zu tun scheint:

for(var m = n.firstChild; m != null; m = m.nextSibling) {

Aber mir ist nicht klar, wie ich mich auf das aktuelle Kind beziehe, wenn ich diesen Wechsel vornehme? Ich hätte nicht mehr die Indexposition des Kindes zu klären. Irgendwelche Vorschläge?

Vielen Dank!

Aktualisieren:

Ich benutze jetzt folgendes, um Vorschläge zu beantworten. Ist dies der richtige/effizienteste Weg, dies zu tun?

function removeTest(child) {
  if (hasClass(child, "lbExclude")) {
    child.parentNode.removeChild(child);
  }
}

function allDescendants(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    var child = node.childNodes[i];
    allDescendants(child);
    removeTest(child);
  }
}

var children = temp.childNodes;
for (var i = 0; i < children.length; i++) {
  allDescendants(children[i]);
};
23
Matrym

Normalerweise haben Sie eine Funktion, die auf allen Knoten rekursiv aufgerufen werden kann. Es hängt wirklich davon ab, was Sie mit den Kindern machen wollen. Wenn Sie einfach alle Nachkommen sammeln möchten, ist element.getElementsByTagName möglicherweise eine bessere Option.

var all = node.getElementsByTagName('*');

for (var i = -1, l = all.length; ++i < l;) {
    removeTest(all[i]);
}
28
James
function allDescendants (node) {
    for (var i = 0; i < node.childNodes.length; i++) {
      var child = node.childNodes[i];
      allDescendants(child);
      doSomethingToNode(child);
    }
}

Sie führen eine Schleife über alle untergeordneten Elemente aus, und für jedes Element rufen Sie dieselbe Funktion auf, und es wird eine Schleife über die untergeordneten Elemente dieses Elements erstellt.

40
Quentin

Es ist nicht erforderlich, die Methode "allDescendants" für alle Kinder aufzurufen, da die Methode selbst dies bereits tut. Also entferne den letzten Codeblock und ich denke, das ist eine richtige Lösung (á, nicht das =])

            function removeTest(child){     
                if(hasClass(child, "lbExclude")){
                    child.parentNode.removeChild(child);
                }
            }

            function allDescendants (node) {
                for (var i = 0; i < node.childNodes.length; i++) {
                  var child = node.childNodes[i];
                  allDescendants(child);
                  removeTest(child);
                }
            }           

            var children = allDescendants(temp);

wenn Elemente in einer Schleife erstellt werden, sollten Sie einen Index über id = "" datenname oder irgendetwas hinterlassen. Sie können sie dann direkt indizieren, was für die meisten Funktionen wie (! -F) schneller ist. Funktioniert gut für 1024 Bits x 100 Elemente, je nachdem, was Sie tun.

if ( document.getElementById( cid ) ) {
 return;
} else {
  what you actually want
}

dies ist in den meisten Fällen schneller, wenn die Elemente bereits geladen wurden. Scrubben Sie die Seite nur beim Neuladen oder Sichern von Domain-Transfers/Logins/Cors und machen Sie etwas anderes.

1
user10794722

Sie können BFS verwenden, um alle Elemente zu finden.

function(element) {
    // [].slice.call() - HTMLCollection to Array
    var children = [].slice.call(element.children), found = 0;
    while (children.length > found) {
        children = children.concat([].slice.call(children[found].children));
        found++;
    }
    return children;
};

Diese Funktion gibt alle Kinder des Elements zurück.

1
androbin

Wenn Sie Jquery haben und alle untergeordneten Elemente erhalten möchten, können Sie Folgendes verwenden:

 var all_children= $(parent_element).find('*');

Beachten Sie nur, dass all_children eine HTML-Sammlung und kein Array ist. Sie verhalten sich ähnlich, wenn Sie nur eine Schleife bilden, aber die Sammlung verfügt nicht über die nützlichen Array.prototype-Methoden, die Sie sonst mögen. 

1
Luke

Der eindeutigste Weg, dies in modernen Browsern oder mit Babel zu tun, ist dies. Angenommen, Sie haben einen HTML-Knoten $node, dessen untergeordnete Elemente Sie erneut aufrufen möchten.

Array.prototype.forEach.call($node.querySelectorAll("*"), function(node) {
  doSomethingWith(node);
});

Die querySelectorAll('*') auf einem beliebigen DOM-Knoten würde Ihnen all die untergeordneten Knoten des Elements in einer NodeList geben. Da NodeList ein Array-ähnliches Objekt ist, können Sie den Array.prototype.forEach.call verwenden, um diese Liste zu durchlaufen und jedes untergeordnete Objekt innerhalb des Rückrufs einzeln zu verarbeiten.

0
kumar_harsh

Wenn Sie eine js-Bibliothek verwenden, ist das so einfach:

$('.lbExclude').remove();

Wenn Sie alle Elemente unter einem Knoten erfassen möchten, können Sie sie alle nativ erfassen:

var nodes = node.getElementsByTagName('*');
for (var i = 0; i < nodes.length; i++) {
  var n = nodes[i];
  if (hasClass(n, 'lbExclude')) {
    node.parentNode.removeChild(node);
  }
}
0
wombleton