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 相关文章推荐
javascript 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
js保存当前路径(cookies记录)
Dec 14 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
JavaScript SHA512&SHA256加密算法详解
Aug 11 Javascript
js调出上下文菜单的实例
Dec 17 Javascript
vue中遇到的坑之变化检测问题(数组相关)
Oct 13 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
Jan 07 Javascript
详解node child_process模块学习笔记
Jan 24 Javascript
webpack下实现动态引入文件方法
Feb 22 Javascript
在vue中使用css modules替代scroped的方法
Mar 10 Javascript
vue2.0安装style/css loader的方法
Mar 14 Javascript
使用flow来规范javascript的变量类型
Sep 12 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实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
JS 实现Json查询的方法实例
2013/04/12 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
js+css实现回到顶部按钮(back to top)
2016/03/02 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
Node.js搭建小程序后台服务
2018/01/03 Javascript
jQuery实现的点击按钮改变样式功能示例
2018/07/21 jQuery
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
python fabric实现远程部署
2017/01/05 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
基于python中__add__函数的用法
2019/11/25 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
python 爬虫爬取京东ps4售卖情况
2020/12/18 Python
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
高中生校园生活自我评价
2013/09/19 职场文书
工程造价自荐信
2013/10/09 职场文书
中学生运动会入场词
2014/02/12 职场文书
爱心募捐通知范文
2015/04/27 职场文书
被告答辩状范文
2015/05/22 职场文书
汶川大地震感悟
2015/08/10 职场文书
Python打包exe时各种异常处理方案总结
2021/05/18 Python
理解python中装饰器的作用
2021/07/21 Python
Mysql中mvcc各场景理解应用
2022/08/05 MySQL