addEventListener代码片段翻译和跨浏览器检测的使用

addEventListener Code Snippet Translation and Usage for cross-browser detectioin

本文关键字:检测 浏览器 代码 片段 翻译 addEventListener      更新时间:2023-09-26

我遇到了一段我想建模的代码。不过,我有几个问题,也许你们能帮忙。下面是代码:

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 
}
*/

我在某处读到,只有旧的Firefox浏览器支持捕获事件。在整个代码的上下文中,需要这些行吗?

欢迎任何有见地的评论、批评和建议。谢谢!:)

我已经使用try/catch方法一段时间了,它在我当前的项目中一直工作得很好。请看下面的代码片段:

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

上面的示例应该可以在Internet Explorer 5.0之前的所有浏览器上工作;当然,你不可能支持所有古老的浏览器,但是,嘿,马赛克不讲JavaScript,无论如何。

你可以"try"调用addEventListener如果你"catch"到一个错误你可以调用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函数,它会带走浏览器支持的任何东西。