Was macht releaseEvents im Gecko?

- javascript
0 peter
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
HI
Äh. Was soll dies nun? Die Dokumentation ist herrlich unbrauchbar. Ist das einfach nur ein Bug?
Nach dem, was ich dazu gelesen habe: JA.
Eigentlich sollte die Überwachung des Ereignisses, die mit captureEvents() gestartet wurde, damit beendet werden.
So stehts zumindest in allem, was ich da gelesen habe.
Daß releaseEvents() plötzlich was anderes machen soll, hab ich auch nirgends gefunden.
Ich finde keine Quelle, die das Verhalten von releaseEvents erläutert. Wird jemand aus dem Quellcode schlau?
NEIN.
Dumm nur, daß der Browser die Methode kennt, dann aber ganz andere Sachen macht als er soll.
Damit wird eine Abfrage wie:
if(window.releaseEvents){......}
natürlich hinfällig.
Ärgerlich ist, daß die Browserentwickler sich immer wieder solche Bugs leisten.
Wenn dann was nicht funktioniert bleibts an dem hängen, der die Seite (richtig!) geschrieben hat.
Aber damit muß man nunmal leben und auch damit, daß man sich mit solchen Sachen die Nächte um die Ohren schlägt.
Wenn man die Zeit von den Browserherstellern bezahlt bekäme wärs okay.
Rechnet man weltweit die Zeit zusammen, die zusätzlich wegen solcher Sachen gearbeitet wird, ists schon ein immenser wirtschaftlicher Schaden, den die verursachen.
gruß
peter