这是第一个:
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]);
}
}
第二个只是添加一个前缀,它用于什么?
答案 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”有任何特殊含义。