“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
分享到:
相关推荐
为了解决这个问题,我们可以采用异步加载用户控件(User Control)的方法来提高页面性能。 首先,我们要理解什么是用户控件。用户控件是WebForm中一种可重用的自定义控件,它允许开发者将一组相关的HTML元素、...
总结来说,"jQuery+Ajax异步加载分页代码.zip"示例展示了一个完整的异步分页解决方案,涵盖了前端事件绑定、Ajax请求、服务器数据交互以及后端响应处理。这个例子不仅适用于初学者了解异步分页的基本原理,也为有...
本压缩包"jQuery异步加载分页代码.zip"提供了一种利用jQuery来实现异步加载分页的解决方案,主要涉及到的知识点包括jQuery基础、AJAX异步请求和分页逻辑处理。 1. **jQuery基础**:jQuery是一个广泛使用的...
当使用jQuery内置的异步加载脚本方法时,需要意识到这可能会影响到页面中其他的DOM操作或事件绑定,因此建议在文档加载完成后使用$(document).ready()方法中执行脚本加载代码。此外,异步加载虽然可以提升页面加载...
首先,jQuery的`$(document).ready()`函数用于确保DOM加载完成后再执行代码,避免了在页面未完全加载时尝试访问元素的问题。在这个场景中,开发者可能使用它来初始化树形下拉菜单并绑定相关的事件监听器。 Ajax是...
通过查看jQuery的源码,我们可以看到在IE浏览器中,`$(document).ready()`实际上被绑定到了`window.load`事件上,这就解释了为什么在IE中`onload`事件会先于`$(document).ready()`执行。如果页面存在无法访问的资源...
5. **异步脚本加载**:如果问题出在脚本加载顺序上,可以考虑将jQuery库异步加载,确保它在DOM加载后被解析和执行。 在提供的压缩包文件中,虽然没有具体代码示例,但通常会包含一个修复此问题的JavaScript片段或者...
在这个项目中,开发者已经创建了一个自定义的滑动门实现,它解决了常见的问题,如恶意滑动(可能由于用户的过度操作导致的不稳定状态)以及资源加载等待(确保内容在显示前已完全加载)。对于恶意滑动的处理,可能...
无刷新、异步分页是网页开发中的一个重要技术,它能提供流畅的用户体验,避免页面在加载大量数据时出现闪烁或完全重载的情况。这里我们主要讨论基于jQuery的无刷新异步分页插件。 jQuery是一款广泛使用的JavaScript...
在现代Web应用中,图片异步上传和展示已经成为一种常见的需求,特别是在用户交互频繁和页面实时更新的场景下。这个话题主要涉及两个关键技术:Ajax和jQuery。Ajax(Asynchronous JavaScript and XML)允许我们在不...
- **事件绑定**:使用`$(document).ready()`或`$(function() {...})`确保在页面加载完成后执行代码,`$('element').on('event', function() {...})`用于监听和响应特定事件,如按钮点击。 - **DOM操作**:Jquery...
jQuery提供了两个文档就绪事件,它们允许我们在DOM完全加载之后执行代码,但不等待样式表、图片和子框架完成加载。这两个方法是: - `$(function(){})`:简写形式。 - `$(document).ready(function(){})`:完整形式...
3. **事件处理**:jQuery的事件处理同样简单易用,如`$(element).click(function() {})`用于绑定点击事件,`$(document).ready(function() {})`确保在页面加载完成后执行函数。 4. **jQuery动画**:通过`.fadeIn()`...
在网页开发过程中,我们经常需要对某些动态添加到页面中的元素进行事件绑定。如果这些元素在页面加载时并不存在,传统的事件绑定方法将无法应用于这些元素。这时,jQuery的事件委托机制就显得尤为重要。 事件委托的...
在网页开发中,jQuery异步加载分页是一种常见的优化用户体验的技术。它允许用户不需刷新整个页面即可加载更多内容,特别是在处理大量数据如新闻、博客文章或产品列表时,极大地提高了网页性能。本教程将围绕jQuery...
在IT行业中,JavaScript库jQuery极大地简化了前端开发,特别是在处理DOM操作、事件处理以及与服务器进行异步通信方面。在本篇文章中,我们将探讨如何在Java Server Pages (JSP)中利用jQuery的`ajaxSubmit`方法实现...
在使用jQuery ready()方法时,推荐将所有需要在DOM加载完成后执行的JavaScript代码放入ready事件处理函数中。如果需要执行在页面内容完全加载后的操作,如图片加载完成后的某些事件,则应使用load()方法。 另外,...
- 延迟初始化:如果某些图表在页面初次加载时不立即展示,可以使用`window.onload`或`$(document).ready`事件来延迟初始化,提高页面加载速度。 - 图表联动:如果多个图表之间存在关联,可以实现联动效果,如筛选、...