您的位置:首页 > 其它

$(document).ready()方法, onload事件 , $(window).load()方法

2016-04-11 22:37 405 查看
对于body的onload事件和JQuery的ready方法相比,有很多弊端.比如:

1.加载多个函数的问题

在onload事件中只能这样加载,很丑陋…而在JQuery中你可以利用多个JQuery.ready()方法,它们会按次序依次执行

2.代码和内容不分离

3.执行先后顺序不同

对于body.onload事件,是在加载完所有页面内容才会触发,所有内容包括图片,flash等.如果页面的这些内容很多会让用户等待很长时间.

而对于$(document).ready()方法,这个方法只是在页面所有的DOM加载完毕后就会触发,无疑很大的加快了网页的速度.

但是对于一些特殊应用,比如图片的放大缩小,图片的剪裁。需要网页所有的内容加载完毕后才执行的呢?推荐使用$(window).load()方法,这个方法会等到页面所有内容加载完毕后才会触发,并且同时又没有onload事件的弊端.

有网友提到对于frame中使用jquery的ready方法的问题:
一个嵌入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绑定的方法执行之后才轮到。而这个页面中正好在测试环境下有一个访问不到的资源,那十几秒的延迟正是它放大出的时间差。

事件DOMContentLoaded与Load的区别

先看这两句代码:
window.addEventListener(‘load’, loaded, false);
document.addEventListener(‘DOMContentLoaded’, loaded, false);

问题回顾:

一个文档中把样式直接用style内联(这种引进方式是dom方式)进来,然后用DOMContentLoaded来处理js,本来是没问题的。

但是当把内联的样式写在一个外联的样式文件中然后再进来的时候,问题就出现了。

什么原因?

DOMContentLoaded在外联样式加载前(dom加载完后)就触发了,外联的样式还没来得及渲染dom,这样导致DOMContentLoaded捕获的状态是外联样式渲染前的状态。

改变窗口大小可以重新触发样式的渲染,所以会形成一个假象:

页面进来的时候某个被样式定义过高度的元素的offsetHeight在改变一下窗口(或者别的可以引起reflow的操作)时,js获取的这个offsetHeight居然不一样的,而在我们看来页面进来时跟窗口改变后,元素本身就没发生高度变化。

总结:

load事件是在页面所有元素都加载完后触发;

DOMContentLoaded,它是指dom tree加载完就触发。这个事件要小心使用,当然它是个强大的事件,起码用上它在某一层面上防止了页面加载被堵塞。

DOMContentLoaded
developer.mozilla.org上的文章说:

当页面中的文档树解析完成时,在页面的Document对象上,会触发DOMContentLoaded事件.该事件代表了,页面的DOM树已经构建完成,但页面引用的样式表和图像文件,以及包含的框架页面可能还没有加载完成,在页面完全加载完成时,会触发另外一个类似的称为"load"的事件.

<dfn style="display:table-cell;padding: 0 5px;border-bottom: none;cursor:inherit;">接口 :</dfn>Event
<dfn style="display:table-cell;padding: 0 5px;border-bottom: none;cursor:inherit;">是否为同步模式:</dfn>是
<dfn style="display:table-cell;padding: 0 5px;border-bottom: none;cursor:inherit;">是否冒泡 :</dfn> 是
<dfn style="display:table-cell;padding: 0 5px;border-bottom: none;cursor:inherit;">触发源:</dfn> Document
<dfn style="display:table-cell;padding: 0 5px;border-bottom: none;cursor:inherit;">能否阻止默认动作 :</dfn> 否
<dfn style="display:table-cell;padding: 0 5px;border-bottom: none;cursor:inherit;">是否存在默认动作 :</dfn>否
注意: 样式表文件的加载会阻塞脚本执行, 所以,如果你有一个<script>标签放在一个<link rel="stylesheet" ...>标签之后, 则直到该样式表文件加毕完之前,DOMContentLoaded事件都不会触发.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: