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 相关文章推荐
彪哥1.1(智能表格)提供下载
Sep 07 Javascript
jQuery中$.fn的用法示例介绍
Nov 05 Javascript
jQuery中find()方法用法实例
Jan 07 Javascript
Node.js巧妙实现Web应用代码热更新
Oct 22 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
Jan 26 Javascript
原生JS实现的放大镜效果实例代码
Oct 15 Javascript
Bootstrap源码解读按钮(5)
Dec 23 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
Dec 11 Javascript
vue项目常用组件和框架结构介绍
Dec 24 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
Dec 25 jQuery
jQuery中内容过滤器简单用法示例
Mar 31 jQuery
Vue组件系列开发之模态框
Apr 18 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中str_replace函数使用小结
2008/10/11 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
php 基础函数
2017/02/10 PHP
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
python中什么是面向对象
2020/06/11 Python
Django视图、传参和forms验证操作
2020/07/15 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
C有"按引用传递"吗
2016/09/06 面试题
音乐系毕业生自荐信
2013/10/27 职场文书
村委会主任先进事迹
2014/01/15 职场文书
松材线虫病防治方案
2014/06/15 职场文书
体育课外活动总结
2014/07/08 职场文书
2014年底工作总结
2014/12/15 职场文书
护士个人总结范文
2015/02/13 职场文书
工作试用期自我评价
2015/03/10 职场文书
孙振耀退休感言
2015/08/01 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang