我需要一个跨浏览器函数来注册事件处理程序和(大部分)一致的处理程序体验。我不需要像jQuery这样的库的全部重量或功能,所以我写了自己的。我相信我已经用下面的代码完成了我的目标,到目前为止,我的测试已经取得成功,但我一直盯着它太久。我的逻辑或缺陷中是否存在缺失的缺陷?跨浏览器事件处理
编辑1:为了清晰起见,用浏览器意图评论每个块。更新IE块,不要立即致电func
(感谢Andy E's keen eyes)。
编辑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;
}
jQuery是一个非常轻量级的库。使用它有什么问题?有人已经为你完成了所有的工作。或者你只是没有兴趣学习它? – 2010-08-25 17:49:14
@熊会吃掉你 - 66K加上,相比之下,这远非轻量级。特别是如果这就是他所需要的。 @ Bill Ayakatubby - 通过“跨浏览器”,你的意思是,“标准的东西,IE浏览器不能正确处理”。 – Rob 2010-08-25 17:52:52
@熊:在这个时候,我唯一的跨浏览器问题是事件注册,所以我不需要jQuery或其他库。如果我的情况发生变化,我会重新评估图书馆的必要性。 – 2010-08-25 17:54:16