Peterle: rekursives loeschen von childs - funktioniert nicht

Hallo Leute,

Ich erstelle in einem div mit js verschiedene Element. Spaeter moechte ich alle Elemente unter diesem div wieder loeschen. Dazu hab ich eine rekursive function geschrieben, aber irgendwie funktioniert sie nicht. Einige Elemente werden nicht geloescht. Sieht irgendjemand einen Fehler? oder gibt es eine andere Methde alle Elemente unter einem Element zu loeschen?

danke
Peterle

function rek_remove(obj)
    {

if (obj && obj.hasChildNodes())
      {
      for (var i = 0; i < obj.childNodes.length; i++)
        {
        rek_remove(obj.childNodes[i]);
        obj.removeChild(obj.childNodes[i]);
        }
      }
    } // end function rek_remove(obj)

  1. Hallo Peterle,

    die Kindsknoten "rutschen nach", sobald du einen gelöscht hast. Daher löscht deine Schleife nur jeden zweiten und nach der Hälfte greift sie ins Leere. Lösch doch einfach n-mal den ersten.

    Gruß, Jürgen

    1. Danke, jetzt funktioniert es.

      Gruss
        Peterle

  2. Hallo Peterle,

    ich musste einfach mal den Titel des Threads ändern, das tat mir als Anglisten in den Augen weh! Inhaltlich dürfte Jürgens Hinweis ja wohl helfen.

    Gruß Gernot

    1. Hallo Gernot,

      Hoffentlich gehts deinen Augen wieder besser ;)
      Werde in Zukunft versuchen etwas mehr nachzudenken bevor ich schreibe, aber Zeitdruck mindert nun mal die Qualitaet.

      Gruss
      Peterle

      1. Hi,

        aber Zeitdruck mindert nun mal die Qualitaet.

        na, stimmt das denn auch? Darf man Qualitaet mit dieser Begruendung denn mindern?

        Gruss,
        Ludger

  3. Hi,

    oder gibt es eine andere Methde alle Elemente unter einem Element zu loeschen?

    Ja.
    Ich weiß nicht ob Thomas Meinike das selbst erfunden hat, aber folgende Idee habe ich bei ihm zuerst gefunden und natürlich sofort geklaut:

    function removeAllChildsFromNode(_nodeId){
      var arnold = document.getElementById(_nodeId);
      var adam   = arnold.cloneNode(false);
      arnold.parentNode.replaceChild(adam,arnold);
    }

    Die Funktion "arnold.cloneNode(false)" kopiert "arnold" _ohne_ den Inhalt nach "adam" (wegen des Argumentes "false". "true" würde entsprechend mit Inhalt kopieren). Somit haben wir eine leere Kopie des übergebenen Knotens und können das Original einfach damit ersetzen. Laut einigen vom Kollegen Meinike durchgeführten Benchmarks ist dieses Vorgehen sogar eindeutig schneller als eine Schleife. Er hatte das allerdings mit Adobes SVG-Viewer getestet, wenn ich mich recht entsinne. Sollte aber nichts ausmachen.
    Und wenn doch kann es nicht viel sein und wird durch die Eleganz obiger Lösung sowieso mehr als wettgemacht! ;-)

    BTW: Die erste Zeile kann natürlich ausgelassen werden, wenn die Adresse des Knotens schon bekannt ist und direkt übergeben werden kann.

    so short

    Christoph Zurnieden

    1. Hallo Christoph Zurnieden,

      ich habe auch die Erfahrung gemacht, dass das einzelne Löschen vieler Knoten deutlich langsamer ist, als das Entfernen des Elternknotens mit Inhalt. Ich erzeuge daher für "Knotengrupen" DIVs, in die ich Sie lege und so kann ich diese Gruppen recht einfach entfernen.

      Gruß, Jürgen