我需要一个跨浏览器功能来注册事件处理程序和(大部分)一致的处理程序体验。我不需要 jQuery 等库的全部功能或功能,因此我编写了自己的库。我相信我已经用下面的代码实现了我的目标,到目前为止我的测试已经成功,但我已经盯着它太久了。我的逻辑是否存在任何缺陷或我遗漏的陷阱?
EDIT 1:为了清楚起见,用浏览器意图注释了每个块。更新了 IE 块以不调用func
马上(感谢Andy E 敏锐的目光 https://stackoverflow.com/questions/3568753/3568827#3568827).
EDIT 2:更新了 IE 块以进行调用func.call()
with this
代替elem
.
EDIT 3:更新为通过JSLint http://www.jslint.com/与“好的部分”。
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;
}
这条线上有一个问题:
r = elem.attachEvent("on" + evt, func.call(elem, window.event));
这将执行func()立即,而不是将其附加为事件的处理程序。相反,返回值func()将被分配给事件,如果它的类型不是,则会抛出错误"function"
.
我可以理解你不想使用框架,但是很多(many)其他人编写了跨浏览器事件处理片段。约翰·雷西格 http://ejohn.org/blog/flexible-javascript-events/有一个版本,Google 搜索“javascript addEvent”还有更多版本。
http://www.google.com/search?q=javascript+addevent http://www.google.com/search?q=javascript+addevent
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)