Как уже отмечалось ранее, обработчики событий, зарегистрированные методом attachEvent(), вызываются как глобальные функции, а не как методы элемента, в котором они зарегистрированы. Это означает, что внутри таких обработчиков событий ключевое слово this ссылается на глобальный объект Window. Само по се_ бе это не представляет собой большую проблему, однако дело осложняется тем, что в объект события в IE не имеет эквивалентного DOM_свойства currentTarget. Свойство srcElement указывает на элемент, сгенерировавший событие, но если со_ бытие уже начало всплытие, им может быть другой элемент, отличный от эле_ мента, обрабатывающего событие.
Если необходимо написать универсальный обработчик события (который может быть зарегистрирован в любом элементе) и при этом знать, какой элемент его за_ регистрировал, нельзя регистрировать обработчик методом attachEvent(). Нуж_ но либо регистрировать обработчик с помощью модели обработки событий Level 0, либо определить функцию_обертку, которую и зарегистрировать:
// Это обработчик события и элемент, который его регистрирует function genericHandler() {
/* Программный код, использующий ключевое слово this */
}
var element = document.getElementById("myelement");
// Обработчик может быть зарегистрирован с использованием API уровня 0 element.onmouseover = genericHandler;
// Или можно создать замыкание
element.attachEvent("onmouseover", function() {
// Вызов обработчика как метода элемента genericHandler.call(element, event);
});
Проблема с прикладным интерфейсом (API) Level 0 заключается в том, что он не позволяет регистрировать несколько функций_обработчиков, а проблема с замы_ каниями связана с утечками памяти в IE. Более подробные сведения об этом приводятся в следующем разделе.
430 Глава 17. События и обработка событий
