Normalerweise schreiben wir das Ereignisobjekt wie folgt:
Funktion getEvent(event) {
Rückgabeereignis ||. window.event // IE:window.event
}
Wenn keine Parameter vorhanden sind, kann es auch geschrieben werden als (Nicht-IE: Das Ereignisobjekt wird automatisch an die entsprechende Ereignisverarbeitungsfunktion übergeben und ist der erste Parameter):
Funktion getEvent() {
Rückgabeargumente[0] ||. window.event // IE:window.event
}
Diese Schreibweise läuft problemlos auf anderen Browsern als Firefox (Testversion: 3.0.12, siehe unten), aber warum ist Firefox eine Ausnahme? Nehmen wir eine Situation wie diese:
<button id="btn" onclick="foo()">Schaltfläche</button>
<Skript>
Funktion foo(){
var e = getEvent();
alarm(e);}
</script>
Das laufende Ergebnis ist in Firefox undefiniert, warum?
Der Aufruf in Firefox sieht tatsächlich so aus: Der erste auszuführende Aufruf lautet:
Funktion onclick(event) {
foo();
}
Dann wird der Aufruf ausgeführt:
Funktion foo(){
var e = getEvent();
Warnung(e);
}
Sie werden feststellen, dass foo() in onclick="foo()" unter Firefox die Ereignisobjektparameter nicht automatisch übergeben kann, sondern standardmäßig an die vom System generierte onclick-Funktion übergeben wird. In diesem Beispiel können wir getEvent.caller übergeben .caller.arguments[ 0] Ruft das Ereignisobjekt ab.
Daher kann unser getEvent wie folgt optimiert werden (siehe die getEvent-Methode in event/event-debug.js in yui_2.7.0b):
Funktion getEvent(event) {
var ev = Ereignis ||. window.event;
if (!ev) {
var c = this.getEvent.caller;
während (c) {
ev = c.arguments[0];
if (ev && (Event == ev.constructor || MouseEvent == ev.constructor)) { /Yi Feis Hinweis: YUI-Quellcode-FEHLER, ev.constructor kann auch MouseEvent sein, nicht unbedingt Event
brechen;
}
c = c.caller;
}
}
Rückkehr ev;
}
Natürlich gibt es eine sehr einfache Lösung, nämlich die Parameter manuell an onclick="foo()" zu übergeben:
<button id="btn" onclick="foo(event)">Schaltfläche</button>