Метод подключения прослушивателя событий, поддерживаемый всеми основными веб-браузерами

Мне нужно написать кусок кода, который прикрепит обработчик к выбранному событию и будет работать в любом популярном браузере, в любой его версии.После некоторых поисков я получил следующую функцию:

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, поэтому я могу быть уверен, что этот конкретный тип события будет перехвачен моим скриптом, независимо от того, в каком браузере или его версии я использую?

5
задан trejder 13 December 2014 в 20:26
поделиться