我需要一个跨浏览器功能来注册事件处理程序和(大部分)一致的处理程序体验。我不需要像 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;
}