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

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

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 Ответ

0 голосов
/ 03 октября 2012

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

var request;

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

Приведенный выше пример должен работать во всех браузерах до Internet Explorer 5.0;Конечно, вы не можете поддерживать все древние браузеры, но, в любом случае, Mosaic не говорил на JavaScript.затем вызовите 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, которая увлекается всем, что поддерживает браузер.

...