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 相关文章推荐
ASP小贴士/ASP Tips javascript tips可以当桌面
Dec 10 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
Jul 26 Javascript
JqGrid web打印实现代码
May 31 Javascript
jQuery图片轮播滚动切换代码分享
Apr 20 Javascript
javascript实现简单的全选和反选功能
Jan 05 Javascript
Vue.js系列之项目搭建(1)
Jan 03 Javascript
JS实现json的序列化和反序列化功能示例
Jun 13 Javascript
Angular2+国际化方案(ngx-translate)的示例代码
Aug 23 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
Jan 27 jQuery
ElementUI之Message功能拓展详解
Oct 18 Javascript
vuex实现数据状态持久化
Nov 11 Javascript
JavaScript实现京东放大镜效果
Dec 03 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 Mysql日期和时间函数集合
2007/11/16 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
jQuery中fadeOut()方法用法实例
2014/12/24 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
python绘制漏斗图步骤详解
2019/03/04 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
python yield和Generator函数用法详解
2020/02/10 Python
Python logging模块handlers用法详解
2020/08/14 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
linux面试相关问题
2013/04/28 面试题
厂办主管岗位职责范本
2014/02/28 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
玄武湖导游词
2015/02/05 职场文书
护士2015年终工作总结
2015/04/29 职场文书
大学新生入学感想
2015/08/07 职场文书
党员理论学习心得体会
2016/01/21 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript