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, которая увлекается тем, что поддерживает браузер.