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获取flash加载的百分比的实现代码
May 25 Javascript
三种方式获取XMLHttpRequest对象
Apr 21 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
Apr 06 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
May 05 Javascript
基于JavaScript实现添加到购物车效果附源码下载
Aug 22 Javascript
分享javascript、jquery实用代码段
Oct 20 Javascript
Move.js入门
Feb 08 Javascript
Vue v2.5 调整和更新不完全问题
Oct 24 Javascript
JS实现的邮箱提示补全效果示例
Jan 30 Javascript
JS实现全屏预览F11功能的示例代码
Jul 23 Javascript
uni-app实现点赞评论功能
Nov 25 Javascript
JavaScript回调函数callback用法解析
Jan 14 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简单实现快速排序的方法
2015/04/04 PHP
总结对比php中的多种序列化
2016/08/28 PHP
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
VUE预渲染及遇到的坑
2018/09/03 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
ES6知识点整理之函数数组参数的默认值及其解构应用示例
2019/04/17 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
Django URL传递参数的方法总结
2016/08/28 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
Python模拟伯努利试验和二项分布代码实例
2020/05/27 Python
python实现斗地主分牌洗牌
2020/06/22 Python
python中uuid模块实例浅析
2020/12/29 Python
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
美国精油公司:Plant Therapy
2019/05/17 全球购物
技校毕业生的自我评价
2013/12/27 职场文书
物业门卫岗位职责
2013/12/28 职场文书
化学教师自荐信范文
2013/12/28 职场文书
小学课外活动总结
2014/07/09 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
实习生辞职信范文
2015/03/02 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书