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


Posted in Javascript onNovember 11, 2015

页面初始化中,用的较多的就是$(document).ready(function(){//代码}); 或 $(window).load(function(){//代码});

他们的区别就是,ready是在DOM的结构加载完后就触发,load是在页面内包括DOM结构,css,js,图片等都加载完成后再触发,显然ready更适合作为页面初始化使用。但有时候也不尽然。需要进一步查看其内部机制。

那么ready的内部是如何判断DOM的结构加载完的?并且不同的浏览器的判断是如何的?

答案就在jquery代码内,假设jquery的版本是jquery-1.11.3.js。

ready的关键代码(3507~3566行),关键代码用红色标出:

jQuery.ready.promise = function( obj ) {
  if ( !readyList ) {

    readyList = jQuery.Deferred();

    // Catch cases where $(document).ready() is called after the browser event has already occurred.
    // we once tried to use readyState "interactive" here, but it caused issues like the one
    // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
    if ( document.readyState === "complete" ) {
      // Handle it asynchronously to allow scripts the opportunity to delay ready
      setTimeout( jQuery.ready );

    // Standards-based browsers support DOMContentLoaded
    } else if ( document.addEventListener ) {
      // Use the handy event callback
      document.addEventListener( "DOMContentLoaded", completed, false );

      // A fallback to window.onload, that will always work
      window.addEventListener( "load", completed, false );

    // If IE event model is used
    } else {
      // Ensure firing before onload, maybe late but safe also for iframes
      document.attachEvent( "onreadystatechange", completed );

      // A fallback to window.onload, that will always work
      window.attachEvent( "onload", completed );

      // If IE and not a frame
      // continually check to see if the document is ready
      var top = false;

      try {
        top = window.frameElement == null && document.documentElement;
      } catch(e) {}

      if ( top && top.doScroll ) {
        (function doScrollCheck() {
          if ( !jQuery.isReady ) {

            try {
              // Use the trick by Diego Perini
              // http://javascript.nwbox.com/IEContentLoaded/
              top.doScroll("left");
            } catch(e) {
              return setTimeout( doScrollCheck, 50 );
            }

            // detach all dom ready events
            detach();

            // and execute any waiting functions
            jQuery.ready();
          }
        })();
      }
    }
  }
  return readyList.promise( obj );
};

上面的代码在触发ready时可以分成两部分

1.标准浏览器下的触发

当浏览器是基于标准浏览器时,会在加载完DOM结构后触发“DOMContentLoaded”事件,jquery内部就用此事件作为ready的触发源。

document.addEventListener( "DOMContentLoaded", completed, false );

2.IE浏览器下的触发

当浏览器是IE浏览器时,因为IE浏览器(蛋疼并强大着)不支持“DOMContentLoaded”事件,所以只能另谋它法,

(function doScrollCheck() {
          if ( !jQuery.isReady ) {

            try {
              // Use the trick by Diego Perini
              // http://javascript.nwbox.com/IEContentLoaded/
              top.doScroll("left");
            } catch(e) {
              return setTimeout( doScrollCheck, 50 );
            }

            // detach all dom ready events
            detach();

            // and execute any waiting functions
            jQuery.ready();
          }
        })();

IE下的做法 就是上面代码的红字处,用“document.documentElement.doScroll("left")”的方法去滚动页面,如果没加载完就等个50毫秒后继续滚,直到滚的动后就触发ready。

但是,如果页面中有frame的场合,会使用window.onload事件作为ready的触发源。

所以在IE下,页面中有frame时,ready也是等到页面内的所有内容加载完成后再触发。

jQuery中ready与load事件的区别

大家在工作中用jQuery的时候一定会在使用之前这样:

//document ready
$(document).ready(function(){
  ...code...
})
//document ready 简写
$(function(){
  ...code...
})

有些时候也会这么写:

//document load
$(document).load(function(){
  ...code...
})

一个是ready一个是load,这两个到底有什么区别呢?今天我们来聊一聊。
ready与load谁先执行:

大家在面试的过程中,经常会被问到一个问题:ready与load那一个先执行,那一个后执行?答案是ready先执行,load后执行。
DOM文档加载的步骤:

要想理解为什么ready先执行,load后执行就要先聊一下DOM文档加载的步骤:

(1) 解析HTML结构。
(2) 加载外部脚本和样式表文件。
(3) 解析并执行脚本代码。
(4) 构造HTML DOM模型。//ready
(5) 加载图片等外部文件。
(6) 页面加载完毕。//load

从上面的描述中大家应该已经理解了吧,ready在第(4)步完成之后就执行了。但是load要在第(6)步完成之后才执行。

ready事件:

ready事件在DOM结构绘制完成之后就绘执行。这样能确保就算有大量的媒体文件没加载出来,JS代码一样可以执行。

load事件:

load事件必须等到网页中所有内容全部加载完毕之后才被执行。如果一个网页中有大量的图片的话,则就会出现这种情况:网页文档已经呈现出来,但由于网页数据还没有完全加载完毕,导致load事件不能够即时被触发。

总结:

相信大家已经了解了ready与load的区别,其实如果页面中要是没有图片之类的媒体文件的话ready与load是差不多的,但是页面中有文件就不一样了,所以还是推荐大家在工作中用ready。

Javascript 相关文章推荐
JS限制上传图片大小不使用控件在本地实现
Dec 19 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
Dec 19 Javascript
javascript函数定义的几种区别小结
Jan 06 Javascript
Javascript 浮点运算精度问题分析与解决
Mar 26 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
Oct 22 Javascript
详解js跨域原理以及2种解决方案
Dec 09 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
Jun 24 Javascript
简易的JS计算器实现代码
Oct 18 Javascript
详解Js模板引擎(TrimPath)
Nov 22 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
Feb 09 Javascript
Vue 让元素抖动/摆动起来的实现代码
May 31 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 Javascript
浅谈使用MVC模式进行JavaScript程序开发
Nov 10 #Javascript
每天一篇javascript学习小结(基础知识)
Nov 10 #Javascript
jQuery+CSS3实现3D立方体旋转效果
Nov 10 #Javascript
JavaScript中利用各种循环进行遍历的方式总结
Nov 10 #Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 #Javascript
js密码强度校验
Nov 10 #Javascript
详解javascript函数的参数
Nov 10 #Javascript
You might like
《逃离塔科夫》——“萌新劝退,老手自嗨”的硬核FPS游戏
2020/04/03 其他游戏
网络资源
2006/10/09 PHP
PHP编实现程动态图像的创建代码
2008/09/28 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
js星星评分效果
2014/07/24 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
python基础教程之数字处理(math)模块详解
2014/03/25 Python
python常用知识梳理(必看篇)
2017/03/23 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
python生成圆形图片的方法
2020/03/25 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
python常用库之NumPy和sklearn入门
2019/07/11 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
python3实现网页版raspberry pi(树莓派)小车控制
2020/02/12 Python
学校门卫工作职责
2013/12/07 职场文书
高三历史教学反思
2014/01/09 职场文书
酒店开业庆典策划方案
2014/05/28 职场文书
企业晚会策划方案
2014/05/29 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
小学校长个人总结
2015/03/03 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python