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 相关文章推荐
jquery 操作单选框,复选框,下拉列表实现代码
Oct 27 Javascript
jMessageBox 基于jQuery的窗口插件
Dec 09 Javascript
JavaScript初学者应注意的七个细节小结
Jan 30 Javascript
JS替换字符串中空格方法
Apr 17 Javascript
javascript中 try catch用法
Aug 16 Javascript
js实现简单计算器
Nov 22 Javascript
AngularJs 国际化(I18n/L10n)详解
Sep 01 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
vue教程之toast弹框全局调用示例详解
Aug 24 Javascript
用ES6写全屏滚动插件的示例代码
May 02 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
Aug 07 Javascript
Node.js中文件系统fs模块的使用及常用接口
Mar 06 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中使用unset销毁变量并内存释放问题
2012/07/05 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
php mysql_list_dbs()函数用法示例
2017/03/29 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
js 蒙版进度条(结合图片)
2010/03/10 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
Python 元组(Tuple)操作详解
2014/03/11 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
Python类装饰器实现方法详解
2018/12/21 Python
django中瀑布流写法实例代码
2019/10/14 Python
使用python turtle画高达
2020/01/19 Python
Python datetime 如何处理时区信息
2020/09/02 Python
学生学习总结的自我评价
2013/10/22 职场文书
教师师德反思材料
2014/02/15 职场文书
中学生励志演讲稿
2014/04/26 职场文书
大学学习计划书范文
2014/05/02 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
董事长秘书工作总结
2015/08/14 职场文书
入党申请书格式
2019/06/20 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
Go语言并发编程 sync.Once
2021/10/16 Golang