jQuery的ready方法详解


Posted in Javascript onNovember 27, 2014

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"); 

 }

},

总结:

 页面加载完成有两种事件,一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件),二是onload,指示页 面包含图片等文件在内的所有元素都加载完成。(可以说:ready 在onload 前加载!!!)
一般样式控制的,比如图片大小控制放在onload 里面加载;
jS事件触发的方法,可以在ready 里面加载;

Javascript 相关文章推荐
jquery检测input checked 控件是否被选中的方法
Mar 26 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 Javascript
js实现对ajax请求面向对象的封装
Jan 08 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
Jun 03 Javascript
微信小程序-详解数据缓存
Nov 24 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
Dec 12 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
Jul 27 Javascript
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
Vue组件内部实现一个双向数据绑定的实例代码
Apr 04 Javascript
layui table 获取分页 limit的方法
Sep 20 Javascript
vue+axios实现post文件下载
Sep 25 Javascript
vue项目中使用vue-layer弹框插件的方法
Mar 11 Javascript
javascript 面向对象封装与继承
Nov 27 #Javascript
javascript制作坦克大战全纪录(2)
Nov 27 #Javascript
javascript制作坦克大战全纪录(1)
Nov 27 #Javascript
使用jsonp完美解决跨域问题
Nov 27 #Javascript
JavaScript变量声明详解
Nov 27 #Javascript
js脚本实现数据去重
Nov 27 #Javascript
实例分析js和C#中使用正则表达式匹配a标签
Nov 26 #Javascript
You might like
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
vue组件创建的三种方式小结
2020/02/03 Javascript
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
Python 自动安装 Rising 杀毒软件
2009/04/24 Python
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
python3实现磁盘空间监控
2018/06/21 Python
Python判断有效的数独算法示例
2019/02/23 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
linux面试题参考答案(5)
2014/09/01 面试题
主办会计岗位职责
2014/03/13 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
JavaScript异步操作中串行和并行
2021/11/20 Javascript
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python