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 相关文章推荐
js 分栏效果实现代码
Aug 29 Javascript
JS 实现双色表格实现代码
Nov 24 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
Mar 04 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
Oct 18 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
Jul 15 Javascript
js字符串转成JSON
Nov 07 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
Sep 15 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
jQuery实现表格元素动态创建功能
Jan 09 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
Jul 12 Javascript
微信小程序支付及退款流程详解
Nov 30 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
Sep 21 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错误信息方法的详解
2013/06/09 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
AngularJs Dependency Injection(DI,依赖注入)
2016/09/02 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
js实现九宫格拼图小游戏
2017/02/13 Javascript
通过命令行生成vue项目框架的方法
2017/07/12 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
浅谈JS中this在各个场景下的指向
2019/08/14 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
用Python编程实现语音控制电脑
2014/04/01 Python
Python循环语句之break与continue的用法
2015/10/14 Python
Python实现将xml导入至excel
2015/11/20 Python
python如何重载模块实例解析
2018/01/25 Python
Python实现购物车程序
2018/04/16 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
python装饰器练习题及答案
2019/11/01 Python
先进党支部事迹材料
2014/01/13 职场文书
五型班组建设方案
2014/02/10 职场文书
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
法人授权委托书
2014/04/03 职场文书
《春晓》教学反思
2014/04/20 职场文书
美化环境标语
2014/06/20 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
Elasticsearch 批量操作
2022/04/19 Python
CSS使用Flex和Grid布局实现3D骰子
2022/08/05 HTML / CSS