Несмотря на то что модель обработки событий в IE предоставляет информацию о событии в объекте Event, этот объект передается только обработчикам событий, зарегистрированным с помощью нестандартного метода attachEvent() (который будет описан позже). Остальные обработчики событий вызываются без аргумен_ тов. Однако получить доступ к объекту Event из обработчиков событий в IE мож_ но с помощью свойства event глобального объекта Window. Это значит, что функ_ ция обработки события в IE может обращаться к объекту Event как к window.event или просто как к event. Использование глобальной переменной там, где годится аргумент функции, может показаться странным, но схема IE работает, т. к. в программной модели обработки событий неявно предполагается, что одновре_ менно всегда обрабатывается только одно событие. Поскольку два события нико_ гда не обрабатываются одновременно, можно спокойно сохранять информацию о текущем обрабатываемом событии в глобальной переменной.
Объект Event представляет собой глобальную переменную, и это несовместимо со стандартной моделью DOM Level 2. Обойти это препятствие можно с помощью одной строки кода. Чтобы функция обработки события работала в обеих объект_ ных моделях, напишите ее так, чтобы она ожидала аргумент, а затем, если аргу_ мент не передан, инициализируйте этот аргумент из глобальной переменной. Например:
function portableEventHandler(e) {
if (!e) e = window.event; // Получение информации о событии в IE
// Тело обработчика событий
}
Другой распространенный прием основан на использовании оператора || для возвращения первого определенного аргумента:
function portableEventHandler(event) {
var e = event || window.event;
// Тело обработчика событий
}