我继承了一个看起来非常讨厌的事件绑定包装器,它的基本原理使我无法理解。我所知道的是使用它的插件的 IE 实现如果我尝试用一个简单的attachEvent
或别名通过 jQuery 替换它就会中断。这段代码的作者已经使用它很长时间了,他忘记了它的原理和原因.
function AddEvent(obj, type, fn) {
if (obj.attachEvent) {
obj['e' + type + fn] = fn;
obj[type + fn] = function() {
obj['e' + type + fn](window.event);
};
obj.attachEvent('on' + type, obj[type + fn]);
}
else {
obj.addEventListener(type, fn, false);
}
};
我熟悉将函数直接附加到以事件挂钩命名的 HTML 属性或 DOM 属性的非常基本的方法,但这看起来更糟糕。这是我对正在发生的事情的解释:
创建一个带前缀的字符串,e
由事件挂钩标签和字符串强制函数 (!?) 组成;在相关元素上创建该名称的属性,并将函数分配给它。
obj['e' + type + fn] = fn;
没有前缀的相同字符串将是元素的另一个属性,它调用一个函数,该函数反过来执行原始传递的函数(出于某种原因使用我们刚刚定义的别名),并window.event
作为参数。
obj[type + fn] = function() {
obj['e' + type + fn](window.event);
};
最后,使用attachEvent
方法将前面的函数绑定到事件钩子上。
obj.attachEvent('on' + type, obj[type + fn]);