jQuery的ready方法实现原理分析


Posted in Javascript onOctober 26, 2016

jQuery中的ready方法实现了当页面加载完成后才执行的效果,但他并不是window.onload或者doucment.onload的封装,而是使用 标准W3C浏览器DOM隐藏api和IE浏览器缺陷来完成的,首先,我们来看jQuery的代码

DOMContentLoaded = function()
 {
  //取消事件监听,执行ready方法
 if ( document.addEventListener )
 {   
  document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
  jQuery.ready();
 }
  else if ( document.readyState === "complete" ) 
 {
  document.detachEvent( "onreadystatechange", DOMContentLoaded );
  jQuery.ready();
 }
};
jQuery.ready.promise = function( obj ) {
 if ( !readyList ) {

  readyList = jQuery.Deferred();
   //表示页面已经加载完成,直接调用 ready方法
  if ( document.readyState === "complete" ) { 
   //将 jQuery.ready压入异步消息队列,设置延迟时间1毫秒(注意,有些浏览器延迟不能小于4毫秒)
   setTimeout( jQuery.ready); 
  } 
  else if ( document.addEventListener ) //
  {
    //监听DOM加载完成
   document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
    //这里是为了确保所有ready执行结束,如果DOMContentLoaded方法执行了,将有一个状态值 isReady被设置为true,因此,
    //ready方法一旦执行,那么将只执行一次,window.addEventListener中的ready 将被 return 中断
   window.addEventListener( "load", jQuery.ready, false );
 
  } else {
   //低版本的IE浏览器
   document.attachEvent( "onreadystatechange", DOMContentLoaded );
   window.attachEvent( "onload", jQuery.ready );

   var top = false;

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

   if ( top && top.doScroll ) //剔除iframe的成分
   {
    (function doScrollCheck() {
     if ( !jQuery.isReady ) {

      try {
       //根据bug来兼容低版本的IE http://javascript.nwbox.com/IEContentLoaded/
       top.doScroll("left");
      } catch(e) {
       //由于低版本的IE 浏览器,onreadystatechange事件不可靠,因此需要根据各个bug来判断页面是否已加载完成
       return setTimeout( doScrollCheck, 50 ); 
      }

      jQuery.ready();
     }
    })();
   }
  }
 }
 return readyList.promise( obj );
};
ready: function( wait )
 {

 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 
  //判断页面是否已完成加载并且是否已经执行ready方法
  return;
 }


 if ( !document.body ) {
  return setTimeout( jQuery.ready );
 }

  
 jQuery.isReady = true; //指示ready方法已被执行

  
 if ( wait !== true && --jQuery.readyWait > 0 ) {
  return;
 }

  
 readyList.resolveWith( document, [ jQuery ] );

  
 if ( jQuery.fn.trigger ) {
  jQuery( document ).trigger("ready").off("ready"); 
 }
},

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
AngularJS控制器继承自另一控制器
May 09 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
Nov 18 Javascript
js简易版购物车功能
Jun 17 Javascript
详解webpack模块加载器兼打包工具
Sep 11 Javascript
JS数组求和的常用方法总结【5种方法】
Jan 14 Javascript
刷新页面后让控制台的js代码继续执行
Sep 20 Javascript
layui use 定义js外部引用函数的方法
Sep 26 Javascript
js实现掷骰子小游戏
Oct 24 Javascript
基于axios 的responseType类型的设置方法
Oct 29 Javascript
Jquery高级应用Deferred对象原理及使用实例
May 28 jQuery
基于vue hash模式微信分享#号的解决
Sep 07 Javascript
JavaScript实现串行请求的示例代码
Sep 14 Javascript
JavaScript中省略元素对数组长度的影响
Oct 26 #Javascript
BootStrap tab选项卡使用小结
Aug 09 #Javascript
Bootstrap按钮功能之查询按钮和重置按钮
Oct 26 #Javascript
AngularJS中如何使用echart插件示例详解
Oct 26 #Javascript
BootStrap modal模态弹窗使用小结
Oct 26 #Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
Oct 26 #Javascript
BootStrap tooltip提示框使用小结
Oct 26 #Javascript
You might like
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
动态生成gif格式的图像要注意?
2006/10/09 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
php技巧小结【推荐】
2017/01/19 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
详解Vue中watch的详细用法
2018/11/28 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python实现的石头剪子布代码分享
2014/08/22 Python
利用Python获取操作系统信息实例
2016/09/02 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
Python魔法方法功能与用法简介
2019/04/04 Python
Python的几种主动结束程序方式
2019/11/22 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
一些关于MySql加速和优化的面试题
2014/01/30 面试题
四年级科学教学反思
2014/02/10 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
征婚广告词
2014/03/17 职场文书
项目经理聘任书
2014/03/29 职场文书
个人政治思想总结
2015/03/05 职场文书
护理自荐信
2019/05/14 职场文书