`

“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

分享到:
评论

相关推荐

    c# webform 异步加载用户控件

    为了解决这个问题,我们可以采用异步加载用户控件(User Control)的方法来提高页面性能。 首先,我们要理解什么是用户控件。用户控件是WebForm中一种可重用的自定义控件,它允许开发者将一组相关的HTML元素、...

    jQuery+ajax异步加载分页代码.zip

    总结来说,"jQuery+Ajax异步加载分页代码.zip"示例展示了一个完整的异步分页解决方案,涵盖了前端事件绑定、Ajax请求、服务器数据交互以及后端响应处理。这个例子不仅适用于初学者了解异步分页的基本原理,也为有...

    jQuery异步加载分页代码.zip

    本压缩包"jQuery异步加载分页代码.zip"提供了一种利用jQuery来实现异步加载分页的解决方案,主要涉及到的知识点包括jQuery基础、AJAX异步请求和分页逻辑处理。 1. **jQuery基础**:jQuery是一个广泛使用的...

    使用jQuery异步加载 JavaScript脚本解决方案

    当使用jQuery内置的异步加载脚本方法时,需要意识到这可能会影响到页面中其他的DOM操作或事件绑定,因此建议在文档加载完成后使用$(document).ready()方法中执行脚本加载代码。此外,异步加载虽然可以提升页面加载...

    jQuery实现支持Ajax异步加载的树形下拉菜单源码.zip

    首先,jQuery的`$(document).ready()`函数用于确保DOM加载完成后再执行代码,避免了在页面未完全加载时尝试访问元素的问题。在这个场景中,开发者可能使用它来初始化树形下拉菜单并绑定相关的事件监听器。 Ajax是...

    jquery的$(document).ready()和onload的加载顺序

    通过查看jQuery的源码,我们可以看到在IE浏览器中,`$(document).ready()`实际上被绑定到了`window.load`事件上,这就解释了为什么在IE中`onload`事件会先于`$(document).ready()`执行。如果页面存在无法访问的资源...

    解决chrome对jQuery的支持问题

    5. **异步脚本加载**:如果问题出在脚本加载顺序上,可以考虑将jQuery库异步加载,确保它在DOM加载后被解析和执行。 在提供的压缩包文件中,虽然没有具体代码示例,但通常会包含一个修复此问题的JavaScript片段或者...

    jquery选择卡/滑动门效果(解决了恶意滑动, 资源加载等待)

    在这个项目中,开发者已经创建了一个自定义的滑动门实现,它解决了常见的问题,如恶意滑动(可能由于用户的过度操作导致的不稳定状态)以及资源加载等待(确保内容在显示前已完全加载)。对于恶意滑动的处理,可能...

    无刷新,异步分页插件

    无刷新、异步分页是网页开发中的一个重要技术,它能提供流畅的用户体验,避免页面在加载大量数据时出现闪烁或完全重载的情况。这里我们主要讨论基于jQuery的无刷新异步分页插件。 jQuery是一款广泛使用的JavaScript...

    图片异步上传、展示(逐个)

    在现代Web应用中,图片异步上传和展示已经成为一种常见的需求,特别是在用户交互频繁和页面实时更新的场景下。这个话题主要涉及两个关键技术:Ajax和jQuery。Ajax(Asynchronous JavaScript and XML)允许我们在不...

    Jquery,C#异步刷新源代码

    - **事件绑定**:使用`$(document).ready()`或`$(function() {...})`确保在页面加载完成后执行代码,`$('element').on('event', function() {...})`用于监听和响应特定事件,如按钮点击。 - **DOM操作**:Jquery...

    jQuery 选择器、DOM操作、事件、动画

    jQuery提供了两个文档就绪事件,它们允许我们在DOM完全加载之后执行代码,但不等待样式表、图片和子框架完成加载。这两个方法是: - `$(function(){})`:简写形式。 - `$(document).ready(function(){})`:完整形式...

    异步处理基础UI例子、JQ帮助

    3. **事件处理**:jQuery的事件处理同样简单易用,如`$(element).click(function() {})`用于绑定点击事件,`$(document).ready(function() {})`确保在页面加载完成后执行函数。 4. **jQuery动画**:通过`.fadeIn()`...

    jQuery为DOM动态追加事件的方法

    在网页开发过程中,我们经常需要对某些动态添加到页面中的元素进行事件绑定。如果这些元素在页面加载时并不存在,传统的事件绑定方法将无法应用于这些元素。这时,jQuery的事件委托机制就显得尤为重要。 事件委托的...

    jQuery异步加载分页代码

    在网页开发中,jQuery异步加载分页是一种常见的优化用户体验的技术。它允许用户不需刷新整个页面即可加载更多内容,特别是在处理大量数据如新闻、博客文章或产品列表时,极大地提高了网页性能。本教程将围绕jQuery...

    jsp中使用jquery的ajaxSubmit方法实现现异步上传

    在IT行业中,JavaScript库jQuery极大地简化了前端开发,特别是在处理DOM操作、事件处理以及与服务器进行异步通信方面。在本篇文章中,我们将探讨如何在Java Server Pages (JSP)中利用jQuery的`ajaxSubmit`方法实现...

    jquery事件的ready()方法使用详解

    在使用jQuery ready()方法时,推荐将所有需要在DOM加载完成后执行的JavaScript代码放入ready事件处理函数中。如果需要执行在页面内容完全加载后的操作,如图片加载完成后的某些事件,则应使用load()方法。 另外,...

    同时加载多个echart使用demo

    - 延迟初始化:如果某些图表在页面初次加载时不立即展示,可以使用`window.onload`或`$(document).ready`事件来延迟初始化,提高页面加载速度。 - 图表联动:如果多个图表之间存在关联,可以实现联动效果,如筛选、...

Global site tag (gtag.js) - Google Analytics