【问题标题】:addEventListener Code Snippet Translation and Usage for cross-browser detectioinaddEventListener 跨浏览器检测的代码片段翻译和使用
【发布时间】:2013-07-28 22:00:45
【问题描述】:

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

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

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

【问题讨论】:

  • o.m() 也可以写成o['m'](),后者通常用于需要将m 构建为字符串且不能使用点符号时。

标签: javascript cross-browser addeventlistener attachevent


【解决方案1】:

我使用 try/catch 方法已经有一段时间了,它在我当前的项目中运行良好。请看下面的代码sn-p:

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 函数,它会带走浏览器支持的任何东西。

【讨论】:

  • 谢谢@D.S.施耐德!有趣的方法。前段时间我问过这个问题,所以很抱歉这么晚才感谢你。
猜你喜欢
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多