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 相关文章推荐
一些易混淆且不常用的属性,希望有用
Jan 29 Javascript
document.getElementById方法在Firefox与IE中的区别
May 18 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
Feb 03 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
Apr 07 Javascript
jQuery之尺寸调整组件的深入解析
Jun 19 Javascript
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
js 判断数据类型的几种方法
Jan 13 Javascript
jquery append与appendTo方法比较
May 24 jQuery
Node.js五大应用性能技巧小结(必须收藏)
Aug 09 Javascript
详解Vue 事件修饰符capture 的使用
Dec 29 Javascript
浅谈Node 异步IO和事件循环
May 05 Javascript
React 并发功能体验(前端的并发模式)
Jul 01 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读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
php将session放入memcached的设置方法
2014/02/14 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
js实现的在线调色板功能完整实例
2016/12/21 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
Node.js创建Web、TCP服务器
2017/12/05 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
python中字符串的操作方法大全
2018/06/03 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
PageFactory设计模式基于python实现
2020/04/14 Python
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
工商管理应届生求职信
2013/10/07 职场文书
销售人员求职信
2014/07/22 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2014幼儿园班主任工作总结
2014/12/04 职场文书
收银员岗位职责范本
2015/04/07 职场文书
2016年第16个全民国防教育日宣传活动总结
2016/04/05 职场文书