这两个addEvent函数有什么区别?

时间:2012-05-23 04:46:33

标签: javascript internet-explorer attachevent

这是第一个:

function addEvent(el, type, fn){
    if(el.addEventListener){
        el.addEventListener(type, fn, false);
    }else{
        el[fn] = function(){
            fn.call(el, window.event);
        }
        el.attachEvent('on'+type, el[fn]);
    }
}

和第二个:

function addEvent(el, type, fn){
    if(el.addEventListener){
        el.addEventListener(type, fn, false);
    }else{  
        el['e' + fn] = function(){
            fn.call(el, window.event);
        }
        el.attachEvent('on'+type, el['e'+fn]);
    }
}

第二个只是添加一个前缀,它用于什么?

1 个答案:

答案 0 :(得分:1)

在我看来,两个函数都尝试做同样的事情:以跨浏览器一致的方式绑定事件处理程序(即不支持.addEventListener()的旧IE版本)。如果.addEventListener()方法可用,则使用它,否则它会创建一个代理函数,以确保使用this和事件对象的适当值调用回调函数。

在创建和稍后引用元素上的属性时,差异仅在el[fn]el['e' + fn]之间:

    el[fn] = function(){
        fn.call(el, window.event);
    }

fn的{​​{1}}参数必须是函数引用,并且我不确定如果使用函数引用作为属性名称会发生​​什么,但我猜它实际上是函数addEvent()并使用结果作为属性名称。因此toString()会做同样的事情,但会在开头添加el['e' + fn]。我没有看到“e”有任何特殊含义。