Обычно мы пишем объект события следующим образом:
функция getEvent(событие) {
вернуть событие || window.event // IE:window.event
}
Если параметров нет, это также можно записать как (не IE: объект события будет автоматически передан соответствующей функции обработки событий и является первым параметром):
функция getEvent() {
вернуть аргументы[0] || window.event // IE:window.event
}
Этот способ написания без проблем будет работать в браузерах, отличных от Firefox (тестовая версия: 3.0.12, то же самое ниже), но почему Firefox является исключением? Возьмем такую ситуацию:
<button id="btn" onclick="foo()">Кнопка</button>
<скрипт>
функция фу(){
вар е = getEvent();
предупреждение(е);}
</скрипт>
Результат выполнения не определен в Firefox, почему?
Вызов в Firefox на самом деле выглядит следующим образом. Первый вызов, который нужно выполнить:
функция onclick(событие) {
Фу();
}
Затем выполняется вызов:
функция фу(){
вар е = getEvent();
предупреждение(е);
}
Вы обнаружите, что foo() в onclick="foo()" в Firefox не может автоматически передавать параметры объекта события, но по умолчанию передается в функцию onclick, сгенерированную системой. В этом примере мы можем передать getEvent.caller. .caller.arguments[0] Получить объект события.
Таким образом, наш getEvent можно оптимизировать (см. метод getEvent в event/event-debug.js в yui_2.7.0b):
функция getEvent(событие) {
вар ев = событие || window.event;
если (!ев) {
вар c = this.getEvent.caller;
в то время как (с) {
ev = c.arguments[0];
if (ev && (Event == ev.constructor || MouseEvent == ev.constructor)) { /Примечание И Фэя: ОШИБКА исходного кода YUI, ev.constructor также может быть MouseEvent, не обязательно Event
перерыв;
}
c = c.caller;
}
}
вернуть ев;
}
Конечно, есть очень простое решение — вручную передать параметры в onclick="foo()":
<button id="btn" onclick="foo(event)">Кнопка</button>