我需要编写一段代码,将侦听器附加到选定的事件,并且可以在任何流行的浏览器、任何版本的浏览器中工作。在做了一些搜索后,我得出了以下功能:
function addListener(event, thefunction)
{
if(window.addEventListener)
{
//All browsers, except IE before version 9.
window.addEventListener(event, thefunction, false);
}
else if(window.attachEvent)
{
//IE before version 9.
window.attachEvent(event, thefunction);
}
}
很简单,似乎不言自明。
事件可能存在一些问题DOMContentLoaded
,因为没有任何版本的 IE (AFAIK) 可以识别它,并且开发人员有义务使用它onreadystatechange
。解决这个问题似乎也相当简单,直到 Internet Explorer 9。你只需要在 中多写一行else if(window.attachEvent)
:
event = (event == 'DOMContentLoaded') ? 'onreadystatechange' : "on" + event;
这部分总是在任何版本的 Internet Explorer 中触发,并且这一行提供了事件名称的简单翻译,因此始终使用正确的名称。
但是 Internet Explorer 9(及更高版本)呢?其中,微软决定放弃attachEvent
支持addEventListener
. 但不会onreadystatechange
变成DOMContentLoaded
.
我不能window.addEventListener
部分使用上面的行,因为即使对于其他浏览器,这也会重写DOMContentLoaded
为onreadystatechange
事件并在那里失败,因为他们使用DOMContentLoaded
.
所以,解决这个问题的唯一方法是在部件中添加浏览器检测(类型和版本)window.addEventListener
,如果它检测到脚本正在处理 IE 9 或更高版本,它会将事件名称从DOMContentLoaded
to重写onreadystatechange
(并补充其他事件名称with on
, IE 需要),如果是其他浏览器,事件名称是否会保持不变?
或者也许我错了,因为正如我刚刚测试的那样,在我的 IE 8 中也DOMContentLoaded
没有onreadystatechange
被触发(第一个在 FF / Chrome 中正确触发)。
那么jQuery的.on()
功能(或类似的)呢?有谁知道,如果它支持跨浏览器附加DOMContentLoaded
,那么我可以确定这种特定类型的事件将被我的脚本捕获,无论是在哪个浏览器或我使用的版本中?