Normalmente, escrevemos o objeto de evento da seguinte maneira:
function getEvento(evento) {
evento de retorno || janela.event // IE:window.event
}
Se não houver parâmetros, também pode ser escrito como (não-IE: o objeto de evento será passado automaticamente para a função de processamento de eventos correspondente e é o primeiro parâmetro):
função getEvento() {
retornar argumentos[0] || window.event // IE:window.event
}
Esta forma de escrever não terá problemas para rodar em navegadores diferentes do Firefox (versão de teste: 3.0.12, a mesma abaixo), mas por que o Firefox é uma exceção? Tomemos uma situação como esta:
<button id="btn" onclick="foo()">Botão</button>
<roteiro>
função foo(){
var e = getEvent();
alerta(e);}
</script>
O resultado da execução é indefinido no Firefox, por quê?
A chamada no Firefox é assim. A primeira chamada a ser executada é:
função onclick(evento) {
foo();
}
Então a chamada é executada:
função foo(){
var e = getEvent();
alerta(e);
}
Você descobrirá que foo() em onclick="foo()" no Firefox não pode passar automaticamente os parâmetros do objeto de evento, mas é passado para a função onclick gerada pelo sistema por padrão. Neste exemplo, podemos passar getEvent.caller. .caller.arguments[0] Obtenha o objeto de evento.
Portanto, nosso getEvent pode ser otimizado para (consulte o método getEvent em event/event-debug.js em yui_2.7.0b):
function getEvento(evento) {
var ev = evento || janela.evento;
se (!ev) {
var c = this.getEvent.caller;
enquanto (c) {
ev = c.argumentos[0];
if (ev && (Event == ev.constructor || MouseEvent == ev.constructor)) { /Nota de Yi Fei: BUG do código-fonte YUI, ev.constructor também pode ser MouseEvent, não necessariamente Event
quebrar;
}
c = c.chamador;
}
}
retornar ev;
}
Claro que existe uma solução muito simples, que é passar manualmente os parâmetros para onclick="foo()":
<button id="btn" onclick="foo(event)">Botão</button>