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 相关文章推荐
用正则获取指定路径文件的名称
Feb 27 Javascript
JS 文件本身编码转换 图文教程
Oct 12 Javascript
Javascript的并行运算实现代码
Nov 19 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
Apr 05 Javascript
JavaScript判断textarea值是否为空并给出相应提示
Sep 04 Javascript
JavaScript中创建对象的模式汇总
Apr 19 Javascript
jQuery Dialog 取消右上角删除按钮事件
Sep 07 Javascript
jQuery向父辈遍历的简单方法
Sep 18 Javascript
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
vue2.0实现音乐/视频播放进度条组件
Jun 06 Javascript
Vue props 单向数据流的实现
Nov 06 Javascript
基于Node.js搭建hexo博客过程详解
Jun 25 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
php开发环境配置记录
2011/01/14 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
文本框倒叙输入让输入框的焦点始终在最开始的位置
2014/09/01 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
JS实现的自定义水平滚动字体插件完整实例
2016/06/17 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
js 实现碰撞检测的示例
2020/10/28 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
python实现ip查询示例
2014/03/26 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
Python编程中对super函数的正确理解和用法解析
2016/07/02 Python
python生成大写32位uuid代码
2020/03/03 Python
Python字符串三种格式化输出
2020/09/17 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
信息工程学院毕业生推荐信
2013/11/05 职场文书
职专应届生求职信
2013/11/16 职场文书
认购协议书范本
2014/04/22 职场文书
活动总结模板
2014/05/09 职场文书
岗位职责范本大全
2015/02/26 职场文书
中学教师读书笔记
2015/07/01 职场文书
小学六年级毕业感言
2015/07/30 职场文书
学校标语口号大全
2015/12/26 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫