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语言本身谈项目实战
Dec 27 Javascript
根据出生日期自动取得星座的js代码
Jul 20 Javascript
Jquery提交表单 Form.js官方插件介绍
Mar 01 Javascript
JS获取单击按钮单元格所在行的信息
Jun 17 Javascript
javascript实现tab切换的四种方法
Nov 05 Javascript
基于Jquery easyui 选中特定的tab
Nov 17 Javascript
原生js和jquery分别实现横向导航菜单效果
May 13 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
Nov 17 Javascript
详解js中call与apply关键字的作用
Nov 21 Javascript
Javascript中字符串相关常用的使用方法总结
Mar 13 Javascript
详解小程序BackgroundAudioManager踩坑之旅
Dec 08 Javascript
JQuery常用选择器功能与用法实例分析
Dec 23 jQuery
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/11/11 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件
2011/12/21 Javascript
原生javascript实现DIV拖拽并计算重复面积
2015/01/02 Javascript
js实现人才网站职位选择功能的方法
2015/08/14 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
canvas的神奇用法
2017/02/03 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
微信小程序使用自定义组件导航实现当前页面高亮
2020/01/02 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
Python部署web开发程序的几种方法
2017/05/05 Python
Python中import机制详解
2017/11/14 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
保时捷设计:Porsche Design
2019/03/30 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
面试求职的个人自我评价
2013/11/16 职场文书
英文自荐信格式
2013/11/28 职场文书
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
2014年基建工作总结
2014/12/12 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书