jQuery ready与window.onload用法理解

最近做一个项目,在上一篇文章里面写了一个插件:jQuery滚动固定插件,刚开始时在本地测试,发现都没问题,后来架设到服务器上,发现浮动的末位置总是不对,总以为是哪些代码冲突或者是插件写得不完善,后来开启了调试。发现那个底部Bottom参数的高度随着刷新浏览器在变化,不可能啊。元素是固定在那里的。没有想到是jQuery的原因。

以浏览器装载文档为例,页面加载完毕后,浏览器会通过Javascript为DOM元素添加事件,在常规的Javascript代码中,通常使用window.onload方法,而在Jquery中,使用的是$(document).ready()方法。由于在$(document).ready()方法内注册的事件,只要DOM就绪就会被执行,因此可能此时元素的关联文件未下载完。例如与图片有关的 html下载完毕,并且已经解析为DOM树了,但很有可能图片还没有加载完毕,此时图片的高度和宽度不一定有效。要解决这个问题,可以 使用Jquery中另一个关于页面加载的方法---load()方法。Load()方法会在元素的onload事件中绑定一个处理函数。

如果处理函数绑定 给window对象,则会在所有内容(包括窗口、框架、对象和图像等)加载完毕后触发,如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发。

下面给出jQuery ready与window.onload的区别

 
window.load

$(document).ready()

执行时机

必须等待网页中所有的内容加载完毕后(包括图片)才能执行

网页中所有DOM结构绘制完毕后就执行,可以能DOM元素关联的内容并没有加载完

编写个数

不能同时编写多个

以下代码无法正确执行:

window.onload = function(){

   alert("caibaojian");

};

window.onload = function(){

   alert("caibaojian.com");

};

结果只输出第二个


能同时编写多个

以下代码正确执行:

$(document).ready(function(){

   alert("Hello Caibaojian");

});

$(document).ready(function(){

   alert("Hello caibaojian.com");

});

结果两次都输出


简化写法


$(function(){

   // do something

});

Jquery代码如下:

在jquery脚本加载的时候,会设置一个isReady的标记,监听DOMContentLoaded事件(这个不是什么浏览器都有的,不同浏览器,jquery运作方式不一样).当然遇到调用ready函数的时候,如果isReady未被设置,那就是说页面未加载完,就会把要执行的函数用一个数组缓存起来,当页面加载完后,再把缓存的函数一一执行.
Jquery中的详细代码分析:

 代码如下 复制代码

ready: function(fn) {
// 绑定监听器
bindReady();
// 如果 DOM 加载完成
if ( jQuery.isReady )
// 马上运行此函数
fn.call( document, jQuery );
// 否则保存起来
else
// 把函数加入缓存数组中
jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
return this;
}

让我们看看jquery如果实现不同浏览器dom加载完成的通知 bindReady()函数:

 

 代码如下 复制代码

var readyBound = false;
function bindReady(){
if ( readyBound ) return;
readyBound = true;

// Mozilla,opera,webkitnightlies支持DOMContentLoaded事件
if ( document.addEventListener && !jQuery.browser.opera)
// 直接使用事件回调即可
document.addEventListener( "DOMContentLoaded", jQuery.ready, false );

// 如果是ie并且不是嵌在frame中
// 就需要不断地检查文档是否加载完
if ( jQuery.browser.msie && window == top ) (function(){
if (jQuery.isReady) return;
try {
// 这个地方标记一下,在后面解析(1)
document.documentElement.doScroll("left");
} catch( error ) {
//// 这个地方标记一下,在后面解析(2)
setTimeout( arguments.callee, 0 );
return;
}
// and execute any waiting functions
jQuery.ready();
})();

if ( jQuery.browser.opera )
document.addEventListener( "DOMContentLoaded", function () {
if (jQuery.isReady) return;
for (var i = 0; i < document.styleSheets.length; i++) // 标记(3)
if (document.styleSheets[i].disabled) {
setTimeout( arguments.callee, 0 );
return;
}
// and execute any waiting functions
jQuery.ready();
}, false);

if ( jQuery.browser.safari ) {
var numStyles;
(function(){
if (jQuery.isReady) return;
if ( document.readyState != "loaded" && document.readyState != "complete" ) { // 标记(4)
setTimeout( arguments.callee, 0 );
return;
}
if ( numStyles === undefined )
numStyles = jQuery("style, link[rel=stylesheet]").length;
if ( document.styleSheets.length != numStyles ) { // 标记(5)
setTimeout( arguments.callee, 0 );
return;
}
// and execute any waiting functions
jQuery.ready();
})();
}

// A fallback to window.onload, that will always work
jQuery.event.add( window, "load", jQuery.ready ); // 标记(6)
}
}

1):这个主要是测出ie下的dom ready, 利用在ie下.当dom未完成解析时,调用document的document.documentElement.doScroll(”left”)会出错这个小技巧便可得知dom有没有ready了.
(2):setTimeout( arguments.callee, 0 )这句是表示延迟0秒调用,实际上它不会马上就调用,而是会尽可能快地调用,它告诉浏览器为当前任何挂起的事件运行完事件句柄并且完成了文档当前状态的更新后才调用. Arguments.callee即是外层的匿名函数,参数的调用者
(3):这个地方你也许觉得奇怪,为什么不在mozilla那里一起处理呢? 原因就是opera的DOMContentLoaded事件发生后,其css样式是还没完全可用的,所以要特殊处理,就是判断每个css的tag都是不是enable了.
(4),(5):safari中document.readyState的状态为loaded或complete时,css文件引入还未能确定是不是解析完了的,所以要通过判断其css文件数目
(6):最后,如果上面的hack都不支持的话…就用最保险的load事件,保证能执行到初始化代码

 

时间: 2024-09-20 00:18:08

jQuery ready与window.onload用法理解的相关文章

jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较_jquery

想要添加这个效果,先来弄明白页面的加载和事件执行顺序,看这个简单例子: <html xmlns="http://www.w3.org/1999/xhtml"> <head > <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>验证加载顺序</title> <script src=

浅析document.ready和window.onload的区别

 这篇文章主要介绍了document.ready和window.onload的区别,有需要的朋友可以参考一下 Javascript 只有在DOM元素已经定义以后才可以对其执行某种操作.   jQuery使用document.ready来保证所要执行的代码是在DOM元素被加载完成的情况下执行.比如在"jQuery基础 - 如何开始"一文里,我用到如下jQuery代码:    代码如下: <!--   $(document).ready(function ()            

jquery $(document).ready() 与window.onload的区别

Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间          window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行.          $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕.  2.编写个数不同           window.onload不能同时编写多个,如果有多个window

jquery $(document).ready()和window.onload的区别浅析_javascript技巧

Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间         window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行.         $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同          window.onload不能同时编写多个,如果有多个window.onl

Jquery中$(document).ready()和window.onload的区别

最基本的区别 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个 $(document).ready()可以同时编写多个,并且都可以得到执行 3.简化写法 window.onload没有简化写法 $(document).ready(function()

jquery中的$(document).ready()与window.onload的区别_jquery

所以如果某个图片或者其他资源加载很长时间, 访问者就会看到一个不完整的页面, 甚至在图片加载之前就执行了需要依赖动态添加的元素的脚本而导致脚本错误.window.onload = function() { testDiv.innerHTML = "<div style=\"border:solid 1px #FF0000\">动态创建的div</div>"; } 解决办法就是等DOM被解析后, 在图像和外部资源加载之前执行我们的函数.在jQu

浅析document.ready和window.onload的区别讲解_基础知识

Javascript 只有在DOM元素已经定义以后才可以对其执行某种操作,这个问题在"javascript执行顺序里"http://www.jb51.net/article/44577.htm一文里有详细介绍. jQuery使用document.ready来保证所要执行的代码是在DOM元素被加载完成的情况下执行.比如在"jQuery基础 - 如何开始"一文里,我用到如下jQuery代码: 复制代码 代码如下: <!--   $(document).ready(

jQuery ready方法实现原理详解_jquery

今天闲来无事研究研究jQuery.ready()的内部实现,看JQ的源码一头雾水,由于自己很菜了,于是翻了翻牛人的播客,讲述详细,收获颇多. 先普及一下jquery.ready()和window.onload,window.onload事件是在页面所有的资源都加载完毕后触发的. 如果页面上有大图片等资源响应缓慢, 会导致window.onload事件迟迟无法触发.所以出现了DOM Ready事件. 此事件在DOM文档结构准备完毕后触发, 即在资源加载前触发.  jQuery中的ready方法实现

jquery中$(document).ready()和onload用法区别详解介绍

页面加载完成有两种事件,一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件),二是onload,指示页 面包含图片等文件在内的所有元素都加载完成.(可以说:ready 在onload 前加载!!!) 一般样式控制的,比如图片大小控制放在onload 里面加载; jS事件触发的方法,可以在ready 里面加载; 用jQ的人很多人都是这么开始写脚本的: 通常的写法  代码如下 复制代码 $(function(){ // do something }); 其实这个就是jq ready