Habituellement, nous écrivons généralement l'objet événement comme suit :
fonction getEvent(événement) {
événement de retour || window.event // IE:window.event
}
S'il n'y a pas de paramètres, il peut également être écrit comme (non-IE : l'objet événement sera automatiquement transmis à la fonction de traitement d'événement correspondante et constitue le premier paramètre) :
fonction getEvent() {
return arguments[0] || window.event // IE:window.event
}
Cette façon d'écrire n'aura aucun problème à fonctionner sur d'autres navigateurs que Firefox (version de test : 3.0.12, la même ci-dessous), mais pourquoi Firefox est-il une exception ? Prenons une situation comme celle-ci :
<button id="btn" onclick="foo()">Bouton</button>
<script>
fonction foo(){
var e = getEvent();
alerte(e);}
</script>
Le résultat de l'exécution n'est pas défini dans Firefox, pourquoi ?
L'appel dans Firefox ressemble en fait à ceci. Le premier appel à exécuter est :
fonction onclick (événement) {
foo();
}
Ensuite, l'appel est exécuté :
fonction foo(){
var e = getEvent();
alerte(e);
}
Vous constaterez que foo() dans onclick="foo()" sous Firefox ne peut pas transmettre automatiquement les paramètres de l'objet d'événement, mais est transmis par défaut à la fonction onclick générée par le système. Dans cet exemple, nous pouvons transmettre getEvent.caller. .caller.arguments[ 0] Récupère l'objet événement.
Par conséquent, notre getEvent peut être optimisé (voir la méthode getEvent dans event/event-debug.js dans yui_2.7.0b) :
fonction getEvent(événement) {
var ev = événement ||
si (!ev) {
var c = this.getEvent.caller;
tandis que (c) {
ev = c.arguments[0];
if (ev && (Event == ev.constructor || MouseEvent == ev.constructor)) { /Note de Yi Fei : BUG du code source de YUI, ev.constructor peut également être MouseEvent, pas nécessairement Event
casser;
}
c = c.appelant;
}
}
retourner ev;
}
Bien sûr, il existe une solution très simple, qui consiste à passer manuellement les paramètres à onclick="foo()" :
<button id="btn" onclick="foo(event)">Bouton</button>