Мне нужно написать кусок кода, который прикрепит обработчик к выбранному событию и будет работать в любом популярном браузере, в любой его версии.После некоторых поисков я получил следующую функцию:
function addListener(event, thefunction)
{
if(window.addEventListener)
{
//All browsers, except IE before version 9.
window.addEventListener(event, thefunction, false);
}
else if(window.attachEvent)
{
//IE before version 9.
window.attachEvent(event, thefunction);
}
}
Довольно просто и кажется не требующим пояснений -.
Может возникнуть проблема с событием DOMContentLoaded
, так как ни одна версия IE (AFAIK )не распознает его, и разработчики обязаны использовать вместо него onreadystatechange
. Решение этой проблемы также кажется довольно простым, до Internet Explorer 9. Вам нужно было написать только лишнюю строку вelse if(window.attachEvent)
:
event = (event == 'DOMContentLoaded') ? 'onreadystatechange' : "on" + event;
Эта часть всегда запускалась в любой версии Internet Explorer, и эта строка предоставляла простой перевод имени события, поэтому всегда использовался правильный.
А как насчет Internet Explorer 9 (и выше )? В котором Microsoft решила отказаться от attachEvent
в пользу addEventListener
. Но не меняется onreadystatechange
на DOMContentLoaded
.
Я не могу использовать приведенную выше строку в части window.addEventListener
, потому что это перепишет DOMContentLoaded
в событие onreadystatechange
даже для других браузеров и потерпит там неудачу, поскольку они используют DOMContentLoaded
.
Итак, единственный способ решить эту проблему — добавить тип обнаружения браузера (и версию )в часть window.addEventListener
, и если он обнаружит, что скрипт работает с IE 9 или выше, он перепишет имя события из DOMContentLoaded
-onreadystatechange
(и дополнить название других событий on
, требуется для IE ), а в случае других браузеров оставит имя события без изменений?
Или, может быть, я ошибаюсь, потому что, как я только что проверил, ни DOMContentLoaded
, ни onreadystatechange
не запускаются в моем IE 8 (, первый правильно запускается в FF / Chrome ).
А как насчет функции jQuery .on()
(или аналогичной )? Кто-нибудь знает, поддерживает ли он кросс-браузерное присоединение -к DOMContentLoaded
, поэтому я могу быть уверен, что этот конкретный тип события будет перехвачен моим скриптом, независимо от того, в каком браузере или его версии я использую?