1

我继承了一个看起来非常讨厌的事件绑定包装器,它的基本原理使我无法理解。我所知道的是使用它的插件的 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]);
4

1 回答 1

1

您可能可以将其替换为:

function AddEvent(obj, type, fn) {
    if (obj.attachEvent) {
        obj.attachEvent('on' + type, function (event) {
            return fn(event || window.event);
        });
    }
    else {
        obj.addEventListener(type, fn, false);
    }
};

obj除非对带有两个非常奇怪的属性名称的污染有一些依赖。

于 2013-02-27T17:57:27.210 回答