Por lo general, solemos escribir el objeto de evento de la siguiente manera:
función obtenerEvento(evento) {
evento de retorno || ventana.evento // IE: ventana.evento
}
Si no hay parámetros, también se puede escribir como (no IE: el objeto de evento se pasará automáticamente a la función de procesamiento de eventos correspondiente y es el primer parámetro):
función obtenerEvento() {
argumentos de retorno [0] || ventana.evento // IE: ventana.evento
}
Esta forma de escribir no tendrá problemas para ejecutarse en navegadores distintos de Firefox (versión de prueba: 3.0.12, la misma a continuación), pero ¿por qué Firefox es una excepción? Tomemos una situación como esta:
<botón id="btn" onclick="foo()">Botón</botón>
<guión>
función foo(){
var e = getEvent();
alerta(e);}
</script>
El resultado de la ejecución no está definido en Firefox, ¿por qué?
La llamada en Firefox es en realidad así. La primera llamada a ejecutar es:
función al hacer clic (evento) {
foo();
}
Luego se ejecuta la llamada:
función foo(){
var e = getEvent();
alerta(e);
}
Encontrará que foo() en onclick="foo()" en Firefox no puede pasar automáticamente los parámetros del objeto de evento, pero se pasa a la función onclick generada por el sistema de forma predeterminada. En este ejemplo, podemos pasar getEvent.caller. .caller.arguments[ 0] Obtiene el objeto del evento.
Por lo tanto, nuestro getEvent se puede optimizar (consulte el método getEvent en event/event-debug.js en yui_2.7.0b):
función obtenerEvento(evento) {
var ev = evento || ventana.evento;
si (!ev) {
var c = this.getEvent.caller;
mientras (c) {
ev = c.argumentos[0];
if (ev && (Event == ev.constructor || MouseEvent == ev.constructor)) { / Nota de Yi Fei: ERROR en el código fuente de YUI, ev.constructor también puede ser MouseEvent, no necesariamente Event
romper;
}
c = c.persona que llama;
}
}
devolver ev;
}
Por supuesto, existe una solución muy simple, que consiste en pasar manualmente los parámetros a onclick="foo()":
<botón id="btn" onclick="foo(event)">Botón</button>