text node plötzlich verloren
Jimboo
- javascript
Hallo,
das ist eine eher theoretische Frage für Javascript-Spezis und meinen Code hier zu posten wäre weniger sinnvoll, weil umfangreich, komplex und nicht zur Veröffentlich gedacht.
Prinzipiell werden in einer Methode DOM Knoten durchlaufen und bestimmt Text-Nodes werden in einem Eigenschafts-Array des Objekts festgehalten. Später bei einem click-Event wird das Array ausgelesen. Der Event wird über Prototype JS gesetzt. Nun das seltsame: Ich kann auf alle Objekt-Eigenschaften über this zugreifen (mit .bindAsEventListener(this)), allerdings sind die Referenzen der Text-Nodes im Objekt defekt. Bei einem alert() erhalte ich "[object Text]", aber .parentNode ergibt null. Lese ich vor dem click-Event die Text-Nodes aus, so sind alle Referenzen auf die Text-Nodes korrekt.
Hat jemand schon mal ein ähnliches Problem gehabt? Könnte das an Prototype JS liegen?
Grüße
Jimboo
Hi,
das ist eine eher theoretische Frage für Javascript-Spezis und meinen Code hier zu posten wäre weniger sinnvoll, weil umfangreich, komplex und nicht zur Veröffentlich gedacht.
Trotzdem lassen sich nicht alle Fragen rein in der Theorie klären ...
Prinzipiell werden in einer Methode DOM Knoten durchlaufen und bestimmt Text-Nodes werden in einem Eigenschafts-Array des Objekts festgehalten. Später bei einem click-Event wird das Array ausgelesen. Der Event wird über Prototype JS gesetzt. Nun das seltsame: Ich kann auf alle Objekt-Eigenschaften über this zugreifen (mit .bindAsEventListener(this)), allerdings sind die Referenzen der Text-Nodes im Objekt defekt. Bei einem alert() erhalte ich "[object Text]", aber .parentNode ergibt null. Lese ich vor dem click-Event die Text-Nodes aus, so sind alle Referenzen auf die Text-Nodes korrekt.
Machst du noch irgendwas anderes mit den Textnode - sie aus dem DOM entfernen o.ä.?
Ergibt eine etwas genauere Untersuchung, als ein simples alert sie darstellt, irgendetwas auffälliges, Unterschiede vor und nach dem Klick? (Bspw. Betrachtung des Arrays, das die Referenzen enthält, im FireBug.)
MfG ChrisB
Trotzdem lassen sich nicht alle Fragen rein in der Theorie klären ...
ja das stimmt.
Machst du noch irgendwas anderes mit den Textnode - sie aus dem DOM entfernen o.ä.?
Also mit dem DOM geschieht nichts. Das sollte eigentlich erst auf der Basis der Referenzen verändert werden, was aber seltsamerweise nicht funktioniert.
Ergibt eine etwas genauere Untersuchung, als ein simples alert sie darstellt, irgendetwas auffälliges, Unterschiede vor und nach dem Klick? (Bspw. Betrachtung des Arrays, das die Referenzen enthält, im FireBug.)
Ich habe während des ganzen Programmablaufs den Array-Inhalt geloggt. Das hat mir den Zusammenhang mit dem Klick-Event aufgezeigt und den genauen Punkt des Verlusts.
Firebug gibt keine Fehler aus. Nur bei der weiteren Verwendung des "defekten" Arrays.
das ist eine eher theoretische Frage für Javascript-Spezis und meinen Code hier zu posten wäre weniger sinnvoll, weil umfangreich, komplex und nicht zur Veröffentlich gedacht.
Dann erstelle einen minimalen Testcase, der das Problem reproduziert, poste ihn hier und erst dann können wir weiterdiskutieren.
Hat jemand schon mal ein ähnliches Problem gehabt?
Nein.
Könnte das an Prototype JS liegen?
Höchstwahrscheinlich nicht.
(Aber das könntest du einfach selbst herauskriegen. Arbeite testweise mit traditionellem Event-Handling.)
Prinzipiell bleiben Referenzen auf Knoten solange intakt, solange die Knoten noch eingehangen sind. Wenn sie ausgehangen werden, existieren die Referenzen weiter und sind nutzbar, aber es treten die besagten Phänomene auf (kein parentNode und dergleichen).
Mathias
Prinzipiell bleiben Referenzen auf Knoten solange intakt, solange die Knoten noch eingehangen sind. Wenn sie ausgehangen werden, existieren die Referenzen weiter und sind nutzbar, aber es treten die besagten Phänomene auf (kein parentNode und dergleichen).
Danke für deinen Tipp. Es war tatsächlich eine der 600 Zeilen vorhanden, die früher als gedacht ausgeführt wurde und das DOM als Bugfix für den Firefox neu gesetzt bzw. aktualisiert hat. Geändert wurde an sich nichts am Aufbau, es wurde nur elt.innerHTML = elt.innerHTML ausgeführt.
Grüße
Jimboo
Geändert wurde an sich nichts am Aufbau, es wurde nur elt.innerHTML = elt.innerHTML ausgeführt.
Diese Zuweisung ist in jeder Hinsicht »böse«: Sie räumt alle DOM-Objekte aus dem Speicher und erstellt alle DOM-Objekte neu. Wenn du dann noch irgendwo Referenzen auf alte DOM-Objekte hast, so sind sie Karteileichen.
Ich würde viel daran setzen, diesen »Bugfix« zu vermeiden. Warum setzt du ihn ein?
Mathias
Hi,
Es war tatsächlich eine der 600 Zeilen vorhanden, die früher als gedacht ausgeführt wurde und das DOM als Bugfix für den Firefox neu gesetzt bzw. aktualisiert hat. Geändert wurde an sich nichts am Aufbau, es wurde nur elt.innerHTML = elt.innerHTML ausgeführt.
Das erklärt's natürlich - dadurch werden neue Knoten erzeugt, die den Platz der alten einnehmen. Und damit sind die alten aus dem Dokument herausgenommen, wodurch die Referenzen auf sie u.a. keinen parentNode mehr haben.
MfG ChrisB