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 相关文章推荐
js中Image对象以及对其预加载处理示例
Nov 20 Javascript
JavaScript eval() 函数介绍及应用示例
Jul 29 Javascript
js获取会话框prompt的返回值的方法
Jan 10 Javascript
JavaScript实现的一个倒计时的类
Mar 12 Javascript
JavaScript数据结构与算法之链表
Jan 29 Javascript
js实现复选框的全选和取消全选效果
Jan 03 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
May 28 Javascript
Bootstrap 3多级下拉菜单实例
Nov 23 Javascript
再谈Angular4 脏值检测(性能优化)
Apr 23 Javascript
LayerClose弹窗关闭刷新方法
Aug 17 Javascript
angular 表单验证器验证的同时限制输入的实现
Apr 11 Javascript
ES6基础之字符串和函数的拓展详解
Aug 22 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
CodeIgniter基本配置详细介绍
2013/11/12 PHP
ThinkPHP中where()使用方法详解
2016/04/19 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
js 浏览器事件介绍
2012/03/30 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
WdatePicker.js时间日期插件的使用方法
2017/07/26 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
使用grappelli为django admin后台添加模板
2014/11/18 Python
简单说明Python中的装饰器的用法
2015/04/24 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
业务代表的岗位职责
2013/11/16 职场文书
恶搞卫生巾广告词
2014/03/18 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
单位综合评价意见
2015/06/05 职场文书
集结号观后感
2015/06/08 职场文书
你需要掌握的20个Python常用技巧
2022/02/28 Python