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

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

投稿:mdxy-dxy 字体:[增长 减少] 类型:转载 时间:2009-12-28 我要评论javascript

Jquery中$(document).ready()的做用相似于传统JavaScript中的window.onload方法,不过与window.onload方法仍是有区别的。
 

1.执行时间 

        window.onload必须等到页面内包括图片的全部元素加载完毕后才能执行。 
        $(document).ready()是DOM结构绘制完毕后就执行,没必要等到加载完毕。 

2.编写个数不一样 

         window.onload不能同时编写多个,若是有多个window.onload方法,只会执行一个 
         $(document).ready()能够同时编写多个,而且均可以获得执行 

3.简化写法 

         window.onload没有简化写法 
         $(document).ready(function(){})能够简写成$(function(){});html

在我之前的开发中,通常用到javascript,我都是采用jquery的模式,也就是大多数时候,第一行写的是:java

 

复制代码代码以下:

$(document).ready(function(){
...
});

 

这个时候,不必定要等全部的js和图片加载完毕,就能够执行一些方法,不过有些时候,必需要等全部的jquery


元素都加载完毕,才能够执行一些方法的时候,好比说,部分图片或者什么其余方面尚未加载好,这个时候,点击某些按钮,会致使出现意外的状况,这个时候,就浏览器

须要用到:框架

 

复制代码代码以下:

$(window).load(function() {
$("#btn-upload").click(function(){   //好比说:
 uploadPhotos();
});
});

 

下面是转载的内容,
用$(window).load(function(){...})而不用body.onload()的几个理由
首先它们都是在页面全部元素(包括html标签以及引用到得全部图片,Flash等媒体)加载完毕后执行的,这是它们的共同点.dom

不用body.Onload()理由1:函数

若是咱们想同时加载多个函数,咱们必须这样写测试

<body onload="fn1(),fn2()"></body>看起来极其丑陋,若是用$(window).load()咱们能够这样加载多个函数字体

 

复制代码代码以下:

 $(window).load(function() {
            alert("hello,我是jQuery!");
  });
 $(window).load(function() {
        alert("hello,我也是jQuery");
 });

 

这样写它会从上往下执行这两个函数,而且看起来漂亮多了.

不用body.Onload()理由2:

用body.Onload()不可以作到js和html彻底分离,这是一个很严重的问题.

另外用$(window).load(function(){...})和body.onload()都存在一样一个问题,由于开始也说到了,它们都须要等到页面的全部内容

加载完毕才执行,可是若是当网速比较慢的时候,加载一个页面每每须要较长的时间(几秒到十几秒不等,甚至更长...),因此咱们常常

会遇到页面尚未彻底加载完毕而用户已经在操做页面了这种状况,这样页面表现出来的效果就跟咱们预期的效果不同了,

因此在这里我推荐使用$(document).ready(function(){}),或简写为$(function(){}),由于他会在页面的dom元素加载完毕后就执行,

而无需等到图片或其余媒体下载完毕.

可是有时候确实咱们有须要等到页面的全部东西都加载完后再执行咱们想执行的函数,因此是该使用$(window).load(function(){...})仍是

该使用$(function(){})每每须要结合具体须要而做不一样的选择.

最后附上一段在全部DOM元素加载以前执行的jQuery代码

 

复制代码代码以下:

<script type="text/javascript">
(function() {
            alert("DOM还没加载哦!");
        })(jQuery)
  </script>

 

呵呵,有时候咱们也有这个需求!

 以 浏览器装载文档为例,在页面加载完毕后,浏览器会经过 Javascript 为 DOM 元素添加事件。在常规的 Javascript 代码中,一般使用 window.onload 方法,而在 Jquery 中,使用的是 $(document).ready() 方法。 $(document).ready() 方法是事件模块中最重要一个函数,能够极大的提升 Web 应用程序的速度。

 

   window.load  $(document).ready()  
执行时机  必须等待网页中全部的内容加载完毕后 ( 包括图片 ) 才能执行  网页中全部 DOM 结构绘制完毕后就执行,能够能 DOM 元素关联的内容并无加载完  
编写个数  不能同时编写多个 
如下代码没法正确执行: 

window.onload = function(){ 
 alert(“text1”); 
}; 
window.onload = function(){ 
 alert(“text2”); 
}; 


结果只输出第二个  能同时编写多个 
如下代码正确执行: 

$(document).ready(function(){ 
 alert(“Hello World”); 
}); 
$(document).ready(function(){ 
 alert(“Hello again”); 
}); 

结果两次都输出  
简化写法  无 

 $(function(){ 
 // do something 
}); 

另外,须要注意一点,因为在 $(document).ready() 方法内注册的事件,只要 DOM 就绪就会被执行,所以可能此时元素的关联文件未下载完。例如与图片有关的 html 下载完毕,而且已经解析为 DOM 树了,但颇有可能图片尚未加载完毕,因此例如图片的高度和宽度这样的属性此时不必定有效。要解决这个问题,可使用 Jquery 中另外一个关于页面加载的方法 ---load() 方法。 Load() 方法会在元素的 onload 事件中绑定一个处理函数。若是处理函数绑定给 window 对象,则会在全部内容 ( 包括窗口、框架、对象和图像等 ) 加载完毕后触发,若是处理函数绑定在元素上,则会在元素的内容加载完毕后触发。 
Jquery 代码以下: 
$(window).load(function (){ 
       // 编写代码  
});等价于 JavaScript 中的如下代码 
Window.onload = function (){ 
     // 编写代码 
}

——————————————————————————————

最近在改一个嵌入在frame中的页面的时候,使用了jquery作效果,而页面自己也绑定了onload事件。改完后,Firefox下测试正常流畅,IE下就要等个十几秒jquery的效果才出现,黄花菜都凉了。

  起初觉得是和自己onload加载的方法冲突。网上广泛的说法是$(document).ready()是在页面DOM解析完成后执行,而onload事件是在全部资源都准备完成以后才执行,也就是说$(document).ready()是要在onload以前执行的,尤为当页面图片较大较多的时候,这个时间差可能更大。但是我这页面分明是图片都显示出来十几秒了,还不见jquery的效果出来。

  删了onload加载的方法试试,结果仍是同样,看来没有必要把本来的onload事件绑定也改用$(document).ready()来写。那是什么缘由使得Firefox正常而IE就能呢?接着调试,发现IE下原来绑定的onload方法居然先于$(document).ready()的内容执行,而Firefox则是先执行$(document).ready()的内容,再执行原来的onload方法。这个和网上的说法彷佛不彻底一致啊,呵呵,有点意思,好像愈来愈接近真相了。

  翻翻jquery的源码看看$(document).ready()是如何实现的吧:

if ( jQuery.browser.msie && window == top ) (function(){ 
if (jQuery.isReady) return; 
try { 
document.documentElement.doScroll("left"); 
} catch( error ) { 
      setTimeout( arguments.callee, 0 ); 
       return; 
    } 
   // and execute any waiting functions 
   jQuery.ready(); 
})(); 
jQuery.event.add( window, "load", jQuery.ready ); 

结果很明了了,IE只有在页面不是嵌入frame中的状况下才和Firefox等同样,先执行$(document).ready()的内容,再执行原来的onload方法。对于嵌入frame中的页面,也只是绑定在load事件上执行,因此天然是在原来的onload绑定的方法执行以后才轮到。而这个页面中正好在测试环境下有一个访问不到的资源,那十几秒的延迟正是它放大出的时间差。

转载自:http://www.jb51.net/article/21628.htm

相关文章
相关标签/搜索