molily: Was macht releaseEvents im Gecko?

Beitrag lesen

Hallo,

In neuesten Gecko-Browsern existiert immer noch die Methode window.releaseEvents bzw. document.releaseEvents. Bekanntlich ist diese Funktion wichtig beim Event-Handling mit - gottseiseinerarmenseelegnädig - Netscape 4. Gut, es lässt sich darüber spekulieren, warum Gecko die Methode immer noch kennt, vielleicht einfach aus Gründen der formalen Rückwärtskompatibilität. Andere Browser kennen sie ebenfalls, ebenso captureEvents, dort hat sie aber offensichtlich keine Funktion (am KHTML-Quelltext konnte ich das verifizieren). Im Gecko hat sie aber *irgendeine* Funktion. Leider verstehe ich den Quellcode nicht. Ich sehe nur die Auswirkungen an diesem Beispiel:

http://de.selfhtml.org/javascript/objekte/anzeige/window_release_events.htm

Nachdem releaseEvents ausgeführt wurde, wird die Handler-Funktion bei jedem Tastendruck zweimal gefeuert! Damit hat releaseEvents in Gecko auf jeden Fall nicht dieselbe Funktionalität wie in Netscape 4. Denn im Netscape 4 passiert nach dem zweiten Tastendruck nichts mehr, die Eventüberwachung wird beendet. Die Eventobjekte bei diesem zweimaligen Feuern sind identisch bis auf die eventPhase-Eigenschaft. Normalerweise werden Events über window.onkeypress in der Bubbling-Phase registriert. Daher ist eventPhase normalerweise gleich 3. Durch releaseEvents wird allerdings der Event-Handler in der Target-Phase (2) ebenfalls ausgeführt, sodass der beschriebene Effekt auftritt.

Meine Arbeitshypothese ist also: releaseEvents führt dazu, dass die Event-Handler, die für die Bubbling-Phase registriert sind, derjenigen Objekte, auf die releaseEvents mit entsprechenden Parametern angewendet wird, in der Target-Phase vorher ein zweites Mal feuert. Das mit der Target-Phase ist freilich widersinnig, denn das Objekt (z.B. window), dessen Handlerfunktion ausgeführt wird, ist nicht identisch mit dem target-Element, sondern nur identisch mit dem currentTarget (also wie erwartet mit sich selbst). Das kann man prüfen, wenn man in das Dokument ein Eingabefeld einfügt:

<html><head>
<script type="text/javascript">
window.onload = function () {
window.onkeypress = function (e) { alert("window " + e.eventPhase + " " + e.target + " " + e.currentTarget); };
document.onkeypress = function (e) { alert("document " + e.eventPhase + " " + e.target + " " + e.currentTarget); };
document.forms[0].onkeypress = function (e) { alert("form " + e.eventPhase + " " + e.target + " " + e.currentTarget); };
document.forms[0].elements[0].onkeypress = function (e) { alert("input " + e.eventPhase + " " + e.target + " " + e.currentTarget); };
};
</script>
</head><body>
<form><p><input></p></form>
<a href="#" onclick="window.releaseEvents(Event.KEYPRESS); document.releaseEvents(Event.KEYPRESS); ">releaseEvents</a>
</body></html>

Vor dem Ausführen on releaseEvents: Capture-Phase läuft durch, ohne dass auf einen Handler getroffen wurde. Beim Target-Element existiert einer, der dann ausgeführt wird. Event-Phase 2 (Target-Phase), e.target ist identisch mit e.currentTarget. Dann Bubbling-Phase: form, document, window. Soweit alles logisch.
Nach dem Ausführen von releaseEvents: Capture-Phase ohne Handler. Target-Phase: Handler vom Objekt window feuert. e.eventPhase sagt 2 (Target-Phase)?! e.target zeigt aber auf das input-Element, e.currentTarget auf window. Ebenso mit document: eventPhase gleich 2, target ist das input-Element, currentTarget ist document. Danach läuft die Bubbling-Phase wie oben ab.

Äh. Was soll dies nun? Die Dokumentation ist herrlich unbrauchbar. Ist das einfach nur ein Bug? Ich finde keine Quelle, die das Verhalten von releaseEvents erläutert. Wird jemand aus dem Quellcode schlau?

Mathias