3

我需要一个跨浏览器功能来注册事件处理程序和(大部分)一致的处理程序体验。我不需要像 jQuery 这样的库的全部重量或功能,所以我自己编写了。我相信我已经通过下面的代码实现了我的目标,到目前为止我的测试已经成功,但是我已经盯着它太久了。我的逻辑是否有任何缺陷或我遗漏的陷阱?

编辑 1:为清楚起见,用浏览器意图注释每个块。更新了 IE 块以不立即调用func(感谢Andy E 敏锐的眼睛)。

编辑 2:更新 IE 块以调用func.call()this不是elem.

编辑 3:更新以通过JSLint与“好的部分”。

function hookEvent(elem, evt, func)
{
    if (typeof elem === "string")
    {
        elem = document.getElementById(elem);
    }
    if (!elem)
    {
        return null;
    }
    var old, r;
    if (elem.addEventListener)  //w3c
    {
        elem.addEventListener(evt, func, false);
        r = true;
    }
    else if (elem.attachEvent)  //ie
    {
        elem[evt + func] = function ()
        {
            func.call(this, window.event);
        };
        r = elem.attachEvent("on" + evt, elem[evt + func]);
    }
    else                        //old
    {
        old = elem["on" + evt] ? elem["on" + evt] : function (e) { };
        elem["on" + evt] = function (e)
        {
            if (!e)
            {
                e = window.event;
            }
            old.call(this, e);
            func.call(this, e);
        };
        r = true;
    }
    return r;
}
4

1 回答 1

3

这一行有一个问题:

r = elem.attachEvent("on" + evt, func.call(elem, window.event));

这将立即执行func(),而不是将其附加为事件的处理程序。相反,func()的返回值将分配给事件,如果它的类型不是,则会抛出错误"function"

我可以理解您不想使用框架,但是许多(许多)其他人已经编写了跨浏览器事件处理片段。 John Resig有一个版本,Google for "javascript addEvent" 有更多版本。

http://www.google.com/search?q=javascript+addevent

于 2010-08-25T17:54:59.013 回答