Сообщение от no.
|
Как эта обертка делается?
|
Я использую такую обертку:
/**
* Объявляем и сразу вызываем функции,
* чтоб не проверять поддержку методов
* каждый раз:
*/
var addEventListener = function() {
// Если браузер IE:
if (window.attachEvent)
// Возвращаем функцию для IE:
return function(element, event, callback) {
// Фиксуем callback, чтоб установить правильный
// this, и передавать объект события первым параметром:
callback.__callbackfix = function() {
callback.call(element, window.event);
};
// Устанавливаем обработчик (не забываем про "on")
return element.attachEvent("on" + event, callback.__callbackfix);
}
// Если браузер W3C-совместим:
if (window.addEventListener)
// Возвращаем функцию без фиксов:
return function(element, event, callback) {
// Последний параметр всегда false, для совместимости с IE:
return element.addEventListener(event, callback, false);
}
}();
var removeEventListener = function() {
// Если браузер IE:
if (window.detachEvent)
return function(element, event, callback) {
// Удаляем наш сохраненный в функции фикс:
return element.detachEvent("on" + event, callback.__callbackfix);
}
// Если браузер W3C-совместим:
if (window.addEventListener)
return function(element, event, callback) {
// Удаляем без фиксов:
return element.removeEventListener(event, callback, false);
}
}();
Он избавляет от всех проблем несовместимости, кроме тех, которые связаны с различными свойствами объекта события.
Но теперь, по крайней мере, в IE будет возможность удалять callback с фиксом "прозрачно".