一种附加事件侦听器的方法,所有主要的web浏览器都支持
A method of attaching event listener, supported by all major web browsers
我需要写一段代码,将侦听器附加到所选事件,并且可以在任何流行的浏览器中,在任何版本中工作
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
。在InternetExplorer9之前,解决这个问题似乎也相当简单。你只需要在else if(window.attachEvent)
:中多写一行
event = (event == 'DOMContentLoaded') ? 'onreadystatechange' : "on" + event;
在任何版本的Internet Explorer中都会触发此部分,这一行提供了事件名称的简单翻译,因此始终使用正确的名称。
但是InternetExplorer9(及以上版本)呢?其中微软决定放弃attachEvent
而选择addEventListener
。但未将onreadystatechange
改为DOMContentLoaded
。
我不能在window.addEventListener
部分使用上面的行,因为这会将DOMContentLoaded
重写为onreadystatechange
事件,即使对于其他浏览器也是如此,并且会在那里失败,因为它们使用DOMContentLoaded
。
那么,解决这个问题的唯一方法是在window.addEventListener
部分添加浏览器检测(类型和版本)吗?如果它检测到脚本处理的是IE 9或更高版本,它会将事件名称从DOMContentLoaded
重写为onreadystatechange
(并用on
补充其他事件名称,这是IE所必需的),如果是其他浏览器,会保持事件名称不变吗?
也许我错了,因为正如我刚刚测试的那样,我的IE 8中既没有DOMContentLoaded
也没有onreadystatechange
(第一个在Firefox/Chrome中正确启动)。
那么jQuery的.on()
函数(或类似函数)呢?有人知道吗,如果它支持DOMContentLoaded
的跨浏览器附加,所以我可以确定,无论我在哪个浏览器或它的版本中使用,这种特定类型的事件都会被我的脚本捕获?
IE9支持DOMContentLoaded。请参见此处。
考虑到这一点,您可以假设,如果支持addEventListener
,那么DOMContentLoaded也支持。
(*除非有人使用Opera 8或Safari 3.0登录您的页面,否则可能不太可能)。
至于jQuery,它遵循支持它的DOMContentLoaded,但在其他方面,它又回到了检测DOM就绪的历史方法,即反复检查DOM树以查看document.body
是否存在。因此,您可以使用其DOM就绪处理程序:
$(function() {
而不必使用CCD_ 22。
关于jQuery如何做到这一点的更多信息,请参阅此答案。
DOMContentLoaded
在IE9及以上版本中本机支持,并且可以通过W3C标准addEventListener
方法附加,该方法也在IE9:中实现
document.addEventListener('DOMContentLoaded', function() {
console.log('DOM ready');
}, false);
这将适用于所有现代浏览器和IE版本9及更高版本。
jQuery1.x与IE6+和任何其他最新浏览器兼容。jQuery可以通过DOM就绪处理程序来填充对IE6-8的支持,从而在跨浏览器中挂接DOM就绪事件
$(function() {
//DOM has loaded, put your code here
});
.on()
提供了事件委派,但这与问题无关。
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 有没有一种方法可以列出Ember.Object的所有绑定
- 如何在所有ng点击事件AngularJS上启动一个方法
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- Underscore.js某些对象的所有方法的总和
- 异步处理所有事件处理程序的方法
- 如何使函数在整个 jQuery 插件及其所有内部方法中可用
- 更改画布图像的所有画布方法
- 我们能否在所有javascript方法中定义“this”的值
- SignalR 一次订阅所有中心/方法
- 如何创建“检查所有”JavaScript方法
- 使用selenium使用javascript查找表中的所有主题字段
- Javascript运行对象和所有这些方法
- 声明Javascript变量的所有可能方法
- 列出一个对象的所有属性/方法
- 在解析service方法上的promise之前,它会转到主方法的promise
- 如何确定从序列中移除子序列的所有可能方法
- 在jquery中触发按钮点击的所有可能方法
- 在es6的构造过程中对所有实例方法自动调用bind()
- 在ASP.从Razor视图中调用控制器动作方法的所有可能方法