`

“DOM ready事件绑定” 在 “异步加载” 中暴露的问题及解决方案(精华帖)

 
阅读更多

“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

分享到:
评论

相关推荐

    js 给动态生成的DOM绑定事件

    web前端的朋友们,经常会遇到给由后台返回的数据遍历生成的DOM绑定事件,但是总是绑定不上,那是因为把事件直接绑定到了动态生成的DOM上了,正确的方式是利用事件冒泡给其父元素绑定,这样才能解决问题的哦!

    javascript为DOM绑定事件 兼容

    javascript为DOM绑定事件 兼容 学习笔记

    js中DOM事件绑定分析.docx

    js中DOM事件绑定分析.docx

    vue动态生成dom并且自动绑定事件

    用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事件(ppt)DOM事件(ppt)DOM事件(ppt)DOM...

    关于动态生成dom绑定事件失效的原因及解决方法

    之前做项目都是直接用jquery的bind绑定事件,不过当时都不是动态生成dom元素,而是已经页面中原本存在的dom元素进行事件绑定,最近在测试给动态生成的dom绑定事件的时候发现事件失效,于是就测试了一下: 1. 事件...

    Virtual-dom-event-binding-issue:尝试使虚拟 dom 事件绑定工作

    虚拟 dom 事件绑定问题 尝试使虚拟 dom 事件绑定工作

    JS同步、异步、延迟加载的方法

    本文讲述了JS同步、异步、延迟加载的方法。分享给大家供大家参考,具体如下: 一:同步加载 我们平时使用的最多的一种方式。 [removed][removed] 同步模式,又称阻塞...异步加载又叫非阻塞加载,浏览器在下载执行j

    JavaScript Dom 绑定事件操作实例详解

    本文实例讲述了JavaScript Dom 绑定事件操作JavaScript Dom 绑定事件操作。分享给大家供大家参考,具体如下: JavaScript Dom 绑定事件 // 先获取Dom对象,然后进行绑定 document.getElementById('xx').onclick ...

    jQuery中ready事件用法实例

    此事件会在文档加载就绪以后触发,也就是当DOM对象已经加载,并且网页内容全部呈现时候触发。 ready()方法可以为ready事件绑定事件处理方法,并且此方法的选择器是唯一的,那就是document对象。 语法形式有三种,后...

    js中DOM事件绑定分析

    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事件(源代码)JavaScript之DOM事件(源...

    jQuery中dom元素上绑定的事件详解

    审查绑定事件的元素(对着它右键->审查元素)在弹出的Elements视图的控制台,右侧点击“Event Listeners”页签然后就能看到所有绑定在该元素的事件了,点开后,找到handler,右击鼠标,选择“Show Function

    JQuery中DOM事件绑定用法详解

    本文实例讲述了JQuery中DOM事件绑定用法。分享给大家供大家参考。具体分析如下: 在文档加载完成后,如果打算为元素绑定事件来完成某些操作,则可以使用bind()方法来对匹配元素进行特定事件的绑定,bind()方法的调用...

    ready:在初始页面加载和动态附加到DOM时检测元素可用性

    在初始页面加载和动态附加到DOM时检测元素可用性 安装 下载 , , 版本或通过NPM安装: npm install @ryanmorr/ready 用法 为您要定位的元素提供一个选择器字符串作为第一个参数,并提供一个回调函数作为第二个...

    angular监听dom加载完毕

    angular监听dom加载完毕

    DOM事件总结(教辅)

    DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件总结(教辅)DOM事件...

    DOM事件总结,前端学习

    HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序。 事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户点击按钮)。 提示: 在 W3C 2 级 DOM 事件中规范了事件模型。

Global site tag (gtag.js) - Google Analytics