addEventListener代码片段转换和用法,用于跨浏览器检测

时间:2011-12-08 19:48:32

标签: javascript cross-browser addeventlistener attachevent

我遇到了一段我想建模的代码。但是,我只是有几个问题,也许你们可以提供帮助。这是代码:

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浏览器支持captureEvents。在整个代码的上下文中,需要这些行吗?

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

1 个答案:

答案 0 :(得分:0)

我一直在使用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函数,该函数可以带走浏览器支持的任何内容。