基于jQuery v1.8.3

在js与DOM交互之前要确保DOM已经加载构建完成,在jQuery中都是使用 (fn)
(document).ready(fn)来确保自己写的代码在DOM构建完成之后执行。
那么jQuery的ready事件内部怎么实现的呢?

通过阅读源码(line:842 ~ 898)知道jQuery内部使用四种判别文档是否加载完成的事件:

  1. DOMContentLoaded 初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像和子框架的完成加载

  2. load 一个页面完全加载之后触发

  3. readyStateChange 文档加载状态(document.readyState)改变的时候触发,当document.readyState === ‘complete’ 为 true 表示文档解析完成。

    readyState可能的值有:

    1. loading 加载2. interactive 互动3. complete 完成
    
  4. doScroll 低版本IE支持的事件,如果调用不出错就表示文档解析完成

部分源码如下:

/**
*先检查一下文档是否加载完成了,如果执行这个方法的时候文档已经加载完成还不知道就尴尬了。。。后面注册的监听文档是否加载完成的事件都不会被触发
*因为我们都知道事件的特性就是错过了就是错过了
*/
if ( document.readyState === "complete" ) {setTimeout( jQuery.ready, 1 );
} else if ( document.addEventListener ) {// 检测是否支持 DOMContentLoaded,该事件这是H5新加的事件,在DOM结构构件完成触发,不会等待资源的下载如IMG等,所以会比window.onload提前触发document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );// 监听onload事件window.addEventListener( "load", jQuery.ready, false );
} else {// 这里是低版本的IE浏览器// 通过attachEvent监听readystatechange和load事件document.attachEvent( "onreadystatechange", DOMContentLoaded );window.attachEvent( "onload", jQuery.ready );// 在顶层不在iframe里面var top = false;try {top = window.frameElement == null && document.documentElement;} catch(e) {}if ( top && top.doScroll ) {(function doScrollCheck() {if ( !jQuery.isReady ) {try {top.doScroll("left");} catch(e) {return setTimeout( doScrollCheck, 50 );}jQuery.ready();}})();}

通过以上源码分析,自己来实现一个完整的

需求:

确保代码会在文档加载完的第一时间被调用

可以正确处理多次调用(调用多次ready(fn); ready(fn))

(function(window, undefined){// 任务队列var PENDING = 'pending',COMPLETE = 'complete',first = true, // 第一次调用ready方法queue = [],state = PENDING; // pending complatevar obser = {queue: [],fire: function(){while(this.queue.length){this.queue.shift()();}},add: function(fn){this.queue.push(fn);}};function loaded(){// 防止被触发多次if(state === COMPLETE) return;if(document.addEventListener){state = COMPLETE;obser.fire();document.removeEventListener('DOMContentLoaded', loaded, false);window.removeEventListener('load', loaded, false);}else if(document.readyState === 'complete'){// 这里必须要是 document.readyState === 'complate' 才行state = COMPLETE;obser.fire();document.detachEvent('DOMContentLoaded', loaded);window.detachEvent('load', loaded);}}function ready(fn){if(first){// 如果是第一次调用顺待要注册一下事件if(document.readyState === 'complete'){loaded();}else if(document.addEventListener){document.addEventListener('DOMContentLoaded', loaded, false);window.addEventListener('load', loaded, false);}else{// 这里处理IEdocument.attachEvent('onreadystatechange', loaded);window.attachEvent('onload', loaded);}}if(state === COMPLETE){fn();}else{obser.add(fn);}}window.ready = ready;
})(window, undefined);// 之后直接调用ready(fn)即可

jQuery中的ready相关推荐

  1. js中onload和jQuery中的ready区别

    js中onload和jQuery中的ready区别 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. ------>不能写多个(如果有多个,只会执行一个) $(do ...

  2. js中window.onload 与 jquery中$(document.ready()) 测试

    js中window.onload 与 jquery中$(document.ready())区别,验证代码如下(调换js代码和Jquer代码书写顺序测试,运行结果一样,因此与代码书写位置没关系): &l ...

  3. Jquery中$(document).ready()的作用

    Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 windo ...

  4. jquery中的ready方法和window的onload方法的区别

    jquery中的ready方法和window.onload的区别 区别 jquery的ready方法在网页中的DOM结构加载完成后执行.window.onload()必须等到网页全部加载完毕(包括图片 ...

  5. jquery 中 $(document).ready() 与window.onload 的区别

    Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 windo ...

  6. jquery (js中window.onload与jquery中$(document.ready())的区别)

    jquery 学习之一(js中window.onload与jquery中$(document.ready())的区别) 耳听为虚,眼见为实.通过下面的实例可查看两者的异同(注意:aa.jpg最好是一张 ...

  7. jQuery中$(document).ready()和window.onload的区别

     $(document) ready()和window onload在表面上看都是页面加载时我们就去执行一个函数或动作,但是在具体的细节上$(document) ready()和window onlo ...

  8. Jquery中$(document).ready(function(){ })函数的使用详解

    Jquery是优秀的Javascrīpt框架,$是jquery库的申明,它很不稳定(我就常遇上),换一种稳定的写法jQuery.noConflict(); jQuery(document).ready ...

  9. jquery中的ready函数与window.onload谁先执行

    关于$(document).ready(): jquery中的$(document).ready(),那$(document).ready()到底是什么作用呢?是不是可以用window.onload ...

  10. 关于Jquery中 “$(document).ready(function(){ })”函数的使用

    Jquery是优秀的Javascrīpt框架,$是jquery库的申明,它很不稳定(我就常遇上),换一种稳定的写法jQuery.noConflict();                   jQue ...

最新文章

  1. 【驱动】GPIO 作为按键时的 设备树 配置
  2. 数字转换成中文大小写
  3. sqli-labs(40)
  4. 计算机二级web题目(3)--HTML基础
  5. [转载] java中的经典问题:传值与传引用
  6. 安装cm初始脚本配置数据库scm_prepare_database.sh(在主节点上)遇到的问题
  7. pytorch模型加密
  8. 高中生如何结合生物思维导图做好知识点整理?
  9. 在office2010的情况下安装xcelsius2008的方法收集
  10. 100以内的的自然数对有多少?
  11. php挂机源码,织音QQ助手QQ互赞挂机开源版源码
  12. 三星s9更新android9.0 体验,国行三星Galaxy S9系列更新Android 9.0 界面更漂亮
  13. word的页脚页码从9开始后面全是1,怎么解决?
  14. 计算机信息计量单位G的单位,计算机中的有些计量单位例如G、MB是表示什么意思?...
  15. System.UnauthorizedAccessException: Access to the path 'D:/web/WebMicaps/TempImages/msc_cntr_0.txt'
  16. 《Android群英传》读书笔记
  17. 人工智能技术与物联网的融合
  18. 吕本富:从平台经济到平台经济学
  19. 激流勇进誓破浪,同舟共济达使命
  20. 【NDN IoT】Challenges in IoT Networking via TCP/IP Architecture 全文翻译

热门文章

  1. react组件卸载调用的方法_好程序员web前端培训分享React学习笔记(三)
  2. ldconfig mysql_ldconfig命令介绍
  3. spring cloud gateway 深入了解 - Predicate
  4. Docker 内程序时间设置,很重要
  5. jqGrid 常用方法
  6. Android给TextView和EditText等控件设置透明背景、圆角边框
  7. 对PostgreSQL SPI例子的学习
  8. ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录
  9. mysql 求bit 某位为1_mysql按位的索引判断值是否为1
  10. gcc/g++基本命令简介