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 相关文章推荐
javascript中有趣的反柯里化深入分析
Dec 05 Javascript
表格奇偶行设置不同颜色的核心JS代码
Dec 24 Javascript
javascript删除字符串最后一个字符
Jan 14 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
Feb 13 Javascript
javascript框架设计之类工厂
Jun 23 Javascript
Javascript中判断一个值是否为undefined的方法详解
Sep 28 Javascript
详解在AngularJS的controller外部直接获取$scope
Jun 02 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
Jul 30 Javascript
vue 组件 全局注册和局部注册的实现
Feb 28 Javascript
Vue注册组件命名时不能用大写的原因浅析
Apr 25 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
Sep 02 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
Apr 15 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
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
2018/08/21 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
jquery配合css简单实现返回顶部效果
2013/09/30 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
python定时器(Timer)用法简单实例
2015/06/04 Python
Django框架中方法的访问和查找
2015/07/15 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
库房保管员岗位职责
2014/04/07 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
Python+tkinter实现高清图片保存
2022/03/13 Python
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android