addEventListener Code Snippet Перевод и использование для кросс-браузерного определения

Я наткнулся на кусок кода, который хотел бы смоделировать. Однако у меня есть только несколько вопросов, и, возможно, вы, ребята, можете помочь. Вот код:

function addEvent( brw_obj, type, func ) {

if (brw_obj.addEventListener) { // all browsers except IE < v9
 brw_obj.addEventListener( type, func, false );

} else if (brw_obj.attachEvent) { // IE only for v < v9
 brw_obj["e"+type+func] = func;
 brw_obj[type+func] = function() { 
     brw_obj["e"+type+func]( window.event ); 
    }
 brw_obj.attachEvent( "on"+type, brw_obj[type+func] );
}

/* else if (brw_obj.captureEvents) {
  brw_obj.captureEvents(Event.CLICK); // only works with FF < v3!
}
*/

}

Теперь я немного понимаю, что код проверяет addEventListener или attachEvent; но что означают следующие строки в деталях? Я не видел javascript, написанного так:

brw_obj["e"+type+func] = func;
brw_obj[type+func] = function() { 
brw_obj["e"+type+func]( window.event ); 
 }
brw_obj.attachEvent( "on"+type, brw_obj[type+func] );

Кроме того, является ли использование этого кода хорошим способом обнаружения браузера или объекта?

Я пишу скрипт и должен быть уверен, что он работает во всех современных браузерах, а также в старых. Насколько я понимаю, большинство современных браузеров поддерживают addEventListener, а IE поддерживает attachEvent. Что я не уверен, так это если старые браузеры поддерживают.

Что касается закомментированных строк:

/* else if (brw_obj.captureEvents) {
 brw_obj.captureEvents(Event.CLICK); // only works with FF 
}
*/

Я где-то читал, что captureEvents поддерживается только старыми браузерами Firefox. Нужны ли эти строки в контексте всего кода?

Любые проницательные комментарии, критика и советы приветствуются. Спасибо!:)

1 ответ

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

var request;

try {
    request = new XMLHttpRequest(); // standard
}
catch (e) {
    request = new ActiveXObject("Microsoft.XMLHTTP"); // workaround
}

Приведенный выше пример должен работать во всех браузерах до Internet Explorer 5.0; Конечно, вы не можете поддерживать все древние браузеры, но, в любом случае, Mosaic не поддерживает JavaScript.

Таким образом, вы можете "попытаться" вызвать addEventListener, и если вы "поймаете" ошибку, вы можете вызвать attachEvent.

Просто мои 0,02 доллара.

Я недавно столкнулся с проблемой addEventListener, так что вот мой текущий подход к этому вопросу:

function addEventListener(target, type, listener) {
    if (target) {
        if (target.addEventListener) {
            target.addEventListener(type, listener, false);
        }
        else if (target.attachEvent) {
            target.attachEvent("on" + type, listener);
        }
    }
    else {
        throw new Error("Can't addEventListener: target object is null.");
    }
}

Затем вы просто вызываете новую функцию addEventListener, которая увлекается тем, что поддерживает браузер.

Другие вопросы по тегам