0

这是第一个:

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]);
    }
}

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

4

1 回答 1

1

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

区别仅在于创建和稍后引用元素上的属性时el[fn]el['e' + fn]

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

fn参数addEvent()必须是函数引用,而且我不确定如果您使用函数引用作为属性名称会发生​​什么,但我猜它本质上是toString()对函数执行 a 并将结果用作属性名称。所以el['e' + fn]会做同样的事情,但会添加'e'到开头。我没有看到“e”有任何特殊含义。

于 2012-05-23T05:04:39.403 回答