“DOM ready事件绑定” 在 “异步加载” 中暴露的问题及解决方案(精华帖)
DOM ready:
DOM ready(也称document ready),是一个被广泛用于代替window.onload的事件(准确的讲是一种状态)。对其不是很熟悉的朋友可以
看这里:比window.onload更好的方式(document ready)
在异步加载中的问题:
当一个绑定了DOM ready事件的脚本(绑定方式可参见:window.onload更好的方式(document ready)
)采用异步的方式加载(相关链
接:异步加
载JS的五种方式(详解)
)时,会发生这样的问题:脚本加载完成时,DOM ready事件已经触发过了,这就意味着这个脚本将不
会被执行。这个问题非常棘手,也很容易碰到,那么如何解决呢?你一定会想到,在脚本中加上这样的逻辑“如果DOM ready已经触发,那么
直接执行脚本,如果尚未触发,则向DOM ready事件绑定该脚本”。没错,这样一来这个问题就可以被解决了,但是还有新的问题,那就是如
何知道DOM ready事件已经触发了呢?jQuery则回避了这个问题,它采用了这种方式:做一个双重保险,如果DOM ready错过了那就退而使
用document.readyState == "complete"来作为脚本执行的时间起点。但这种方式显然大打折扣了(因为document.readyState ="complete"
的触发时间几乎和window.onload同时,当页面中有大量图片资源时问题就非常严重了。关于这些事件的触发时间对比,可见:window.onl
-
-oad
更
好的方式(document
ready)
)。
更好的方法:
首先我们来分析一下各个浏览器的特性,在Firefox和Chrome中document.readyState值为interactive时DOM树就已经ready了,而IE不会出现
前面所讲的问题(因为我们是使用document.documentElement.doScroll来定时检测的),在Opera下document.readyState=="complete"和
DOM ready几乎是同时触发的(因此可以直接用document.readyState=="complete"来判断)。有了这些特性,这个问题就迎刃而解了(详
细请看下面的代码)。
Javascript代码:
(function(d, f){
if(window.attachEvent){
(function(){
try{
d.documentElement.doScroll("left");
}catch(err){
setTimeout(arguments.callee, 1);
return;
}
f();
})();
}else{
if((d.readyState == "interactive") && (!!alert) || (d.readyState == "complete")){
f();
}else{
function _f(){
d.removeEventListener("DOMContentLoaded", _f, false);
f();
}
d.addEventListener("DOMContentLoaded", _f, false);
}
}
})(document, main);
代码讲解:
1. 在Firefox和Chrome中,document.readyState=="interactive"时就已经DOM ready了。
2. 在IE中,在DOM ready之前调用document.documentElement.doScroll("left")都会报错,因此使用循环和try...catch来捕捉DOM ready。
3. 在Opera中,document.readyState=="interactive"时alert是不可访问的,因此!!alert将返回false。
4. main是我们所要向DOM ready绑定的函数。
注意事项:
document.readyState == "interactive" 是在DOMContentLoaded事件之前(会早几毫秒)触发的,不过在Chrome和Firefox中,这个时候确
实已经可以完全访问并操作(appendChild、removeChild)DOM元素了(即DOM tree已经ready)。
本文转自http://hi.baidu.com/flondon/item/247985275ba2833694f62b9a
分享到:
相关推荐
web前端的朋友们,经常会遇到给由后台返回的数据遍历生成的DOM绑定事件,但是总是绑定不上,那是因为把事件直接绑定到了动态生成的DOM上了,正确的方式是利用事件冒泡给其父元素绑定,这样才能解决问题的哦!
javascript为DOM绑定事件 兼容 学习笔记
js中DOM事件绑定分析.docx
用jquery的时候你会发现,页面渲染后动态生成的dom,在生成之前的代码是没办法取到相应对象的,必须重新获取.但是vue基于数据绑定的特性让它能生成的时候直接绑定数据。 html: <input type=text v-model...
DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM...
之前做项目都是直接用jquery的bind绑定事件,不过当时都不是动态生成dom元素,而是已经页面中原本存在的dom元素进行事件绑定,最近在测试给动态生成的dom绑定事件的时候发现事件失效,于是就测试了一下: 1. 事件...
虚拟 dom 事件绑定问题 尝试使虚拟 dom 事件绑定工作
本文讲述了JS同步、异步、延迟加载的方法。分享给大家供大家参考,具体如下: 一:同步加载 我们平时使用的最多的一种方式。 [removed][removed] 同步模式,又称阻塞...异步加载又叫非阻塞加载,浏览器在下载执行j
本文实例讲述了JavaScript Dom 绑定事件操作JavaScript Dom 绑定事件操作。分享给大家供大家参考,具体如下: JavaScript Dom 绑定事件 // 先获取Dom对象,然后进行绑定 document.getElementById('xx').onclick ...
此事件会在文档加载就绪以后触发,也就是当DOM对象已经加载,并且网页内容全部呈现时候触发。 ready()方法可以为ready事件绑定事件处理方法,并且此方法的选择器是唯一的,那就是document对象。 语法形式有三种,后...
js事件绑定 JavaScript 有三种事件模型: 内联模型 脚本模型 DOM2 模型 1、内联模型 //基本废除不用 <input type="button" value="按钮" onclick="alert('Lee');" /> <input type="button" ...
JavaScript之DOM事件(源代码)JavaScript之DOM事件(源代码)JavaScript之DOM事件(源代码)JavaScript之DOM事件(源代码)JavaScript之DOM事件(源代码)JavaScript之DOM事件(源代码)JavaScript之DOM事件(源...
审查绑定事件的元素(对着它右键->审查元素)在弹出的Elements视图的控制台,右侧点击“Event Listeners”页签然后就能看到所有绑定在该元素的事件了,点开后,找到handler,右击鼠标,选择“Show Function
本文实例讲述了JQuery中DOM事件绑定用法。分享给大家供大家参考。具体分析如下: 在文档加载完成后,如果打算为元素绑定事件来完成某些操作,则可以使用bind()方法来对匹配元素进行特定事件的绑定,bind()方法的调用...
在初始页面加载和动态附加到DOM时检测元素可用性 安装 下载 , , 版本或通过NPM安装: npm install @ryanmorr/ready 用法 为您要定位的元素提供一个选择器字符串作为第一个参数,并提供一个回调函数作为第二个...
angular监听dom加载完毕
DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件...
HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序。 事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户点击按钮)。 提示: 在 W3C 2 级 DOM 事件中规范了事件模型。