Warum nicht 'undefined' nach removeChild()
Simone
- javascript
0 Mathias Brodala
Guten Abend,
ich blicks nicht!!! Wenn ich folgendes mach,
alert("before delete: " + form.myfield);
form.removeChild(form.myfield);
alert("after delete: " + form.myfield);
dann wird zunächst "before delete: [object HTMLInputElement]" ausgebeben und dann "after delete: [object HTMLInputElement]". Aber genau das macht doch keinen Sinn! Warum ist "form.myfield" nach dem Aufruf von "form.removeChild(form.myfield)" zwar als Kindelement von "form" verschwunden, aber trotzdem noch als "[object HTMLInputElement]" und nicht als "undefined" oder "null" gelistet??? Muss ich dazu anschließend echt explizit "form.myfield = null;" setzen???
Gruß,
Simi
Hallo Simone.
ich blicks nicht!!! Wenn ich folgendes mach,
alert("before delete: " + form.myfield);
form.removeChild(form.myfield);
alert("after delete: " + form.myfield);dann wird zunächst "before delete: [object HTMLInputElement]" ausgebeben und dann "after delete: [object HTMLInputElement]".
Ich bin der Meinung, dass dies ein Bug in Gecko-basierten Browsern ist. Denn die Anzahl der Kindelemente (form.elements.length) wird korrekt geändert und auch die Ausgabe von innerHTML zeigt, dass das Formularelement entfernt wurde.
Sowohl Opera als auch Konqueror als auch IE reagieren wie erwartet.
Einen schönen Sonntag noch.
Gruß, Mathias
Hallo Mathias, das ging aber schnell!
Ich bin der Meinung, dass dies ein Bug in Gecko-basierten Browsern ist.
Also explizit null setzen, oder???
»»Denn die Anzahl der Kindelemente (form.elements.length) wird korrekt geändert und auch die Ausgabe von innerHTML zeigt, dass das Formularelement entfernt wurde.
Seh ich genauso, aber vielen DAnk, wenn du das grad auch nochmal getestet hast.
Sowohl Opera als auch Konqueror als auch IE reagieren wie erwartet.
Sehr schön, danke!
Einen schönen Sonntag noch.
Dir auch!
Simi
Hallo Simone.
Ich bin der Meinung, dass dies ein Bug in Gecko-basierten Browsern ist.
Also explizit null setzen, oder???
Oder auf „undefined“. Im Übrigen habe ich einen zugehörigen Bugreport gefunden, er ist also bekannt.
Einen schönen Sonntag noch.
Dir auch!
Dankeschön.
Gruß, Mathias
Moin!
Ich bin der Meinung, dass dies ein Bug in Gecko-basierten Browsern ist.
Ich bin der Meinung, darüber läßt sich trefflich streiten ;-)
form.myfield ist ja nichts anderes als ein Speicherplatz. Im Prinzip nur ein Pointer auf das Kindelement. Wenn das Kind nun aus dem Baum entfernt wird, muß nicht notwendigerweise auch der Pointer gelöscht werden.
Wie ist es z.B. mit
var myf= form.myfield;
form.removeChild(form.myfield);
Sollte danach auch myf undefined sein?
Und warum sollte das anders sein als:
var myf= form.removeChild(form.myfield);
Hier ist doch myf das "old chilf", richtig?
Und als letztes:
wenn "form.removeChild(form.myfield)" form.myfield auf undefined setzt, sollte dann nicht konsequenterweise eine Zuweisung auf form.myfield eine Auswirkung auf den Baum haben?
IMHO ist es kein Bug.
-- Skeeve
Hallo Skeeve.
Ich bin der Meinung, dass dies ein Bug in Gecko-basierten Browsern ist.
Ich bin der Meinung, darüber läßt sich trefflich streiten ;-)
Jetzt sicher nicht mehr, oder?
form.myfield ist ja nichts anderes als ein Speicherplatz. Im Prinzip nur ein Pointer auf das Kindelement. Wenn das Kind nun aus dem Baum entfernt wird, muß nicht notwendigerweise auch der Pointer gelöscht werden.
Doch, denn ansonsten bleibt eine Leiche im Speicher.
Wie ist es z.B. mit
var myf= form.myfield;
form.removeChild(form.myfield);Sollte danach auch myf undefined sein?
Jawohl.
Und warum sollte das anders sein als:
var myf= form.removeChild(form.myfield);
Hier ist doch myf das "old chilf", richtig?
Ja, und das per Definition, da removeChild immer das entfernte Elementobjekt zurückgibt.
Und als letztes:
wenn "form.removeChild(form.myfield)" form.myfield auf undefined setzt,
Es wird nicht auf undefined gesetzt, sondern das jeweilige Objekt wird aus Dokumentenbaum entfernt. Beim Zugriff auf dieses nicht mehr existente Objekt greift gibt die JS-Engine den Standardwert für nicht vorhandene Objekte zurück, welcher eben „undefined“ ist.
sollte dann nicht konsequenterweise eine Zuweisung auf form.myfield eine Auswirkung auf den Baum haben?
Hat es ja auch. Damit kannst du wiederum dem form-Objekt über die myfield-Eigenschaft etwas neues anhängen.
Einen schönen Sonntag noch.
Gruß, Mathias
Hallo nochmal.
Wie ist es z.B. mit
var myf= form.myfield;
form.removeChild(form.myfield);Sollte danach auch myf undefined sein?
Jawohl.
Interessant. Ein kleiner Test belehrt mich eines besseren. Es verhält sich hier also offenbar wie mit Hardlinks im Dateisystem: so lange es noch mindestens einen Zeiger auf das Objekt gibt, ist es über diesen Zeiger erreichbar. Das heißt, auch wenn form.myfield aus dem Dokumentenbaum entfernt wird, ist es über eine Referenz noch immer erreichbar.
Einen schönen Sonntag noch.
Gruß, Mathias
Hallo,
so lange es noch mindestens einen Zeiger auf das Objekt gibt, ist es über diesen Zeiger erreichbar.
Ja, so arbeitet der JavaScript-Garbage-Collector.
Allerdings würde ich document.forms.Formular.elements.Feld nicht als Referenz ansehen. Aus DOM-Sicht ist form.myField ein Methodenaufruf von HTMLFormElement.elements.namedItem("Feld"). Und elements ist eine HTMLCollection, die sich automatisch ändern sollte, wenn sich der DOM-Baum ändert. Fällt also ein input aus dem DOM, dann darf das zugehörige Elementobjekt auch nicht mehr über die elements-HTMLCollection erreichbar sein. Insofern ist das ein Browserfehler.
Mathias