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 相关文章推荐
js中的window.open返回object的错误的解决方法
Aug 15 Javascript
JavaScript DOM学习第四章 getElementByTagNames
Feb 19 Javascript
javascript中用星号表示预录入内容的实现代码
Jan 08 Javascript
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
javascript实现微信分享
Dec 23 Javascript
JavaScript实现简单的二级导航菜单实例
Apr 15 Javascript
基于JS2Image实现圣诞树代码
Dec 24 Javascript
jQuery实现checkbox列表的全选、反选功能
Nov 24 Javascript
JavaScript中数组常见操作技巧
Sep 01 Javascript
微信小程序实现跑马灯效果
Oct 21 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
Mar 13 Javascript
JS精髓原型链继承及构造函数继承问题纠正
Jun 16 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 dirname()与__FILE__常量的应用
2013/06/24 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
Vue-input框checkbox强制刷新问题
2019/04/18 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
详解Python中with语句的用法
2015/04/15 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
设计部经理的岗位职责
2013/11/16 职场文书
婚礼司仪主持词
2014/03/14 职场文书
生日宴会主持词
2014/03/20 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
大专生找工作自荐书
2014/06/10 职场文书
合同意向书范本
2014/07/30 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
先进员工事迹材料
2014/12/20 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
Python测试框架pytest高阶用法全面详解
2022/06/01 Python