gpt4 book ai didi

javascript - 跨浏览器事件处理

转载 作者:行者123 更新时间:2023-11-29 10:54:18 25 4
gpt4 key购买 nike

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

编辑 1:为了清楚起见,用浏览器意图对每个 block 进行了注释。更新 IE block 以不立即调用 func(感谢 Andy E's keen eyes)。

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

编辑 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;
}

最佳答案

这条线路有问题:

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

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

我能理解您不想使用框架,但是很多(很多)其他人已经编写了跨浏览器事件处理片段。 John Resig有一个版本,谷歌的“javascript addEvent”还有很多。

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

关于javascript - 跨浏览器事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3568753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com