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 实现打印网页中定义的部分内容的代码
Apr 01 Javascript
JavaScript中:表达式和语句的区别[译]
Sep 17 Javascript
jquery表单验证使用插件formValidator
Nov 10 Javascript
JQuery对class属性的操作实现按钮开关效果
Oct 11 Javascript
javascript 构造函数方式定义对象
Jan 02 Javascript
微信企业号开发之微信考勤Cookies的使用
Sep 11 Javascript
将List对象列表转换成JSON格式的类实现方法
Jul 04 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
Feb 13 Javascript
微信小程序表单验证错误提示效果
May 19 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
Mar 09 Javascript
JavaScript实现简单动态表格
Dec 02 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
一次编写,随处运行
2006/10/09 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
php简单定时执行任务的实现方法
2015/02/23 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
Javascript this 的一些学习总结
2012/08/31 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
浅析Js中的单引号与双引号问题
2013/11/06 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
Python中线程编程之threading模块的使用详解
2015/06/23 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
python要安装在哪个盘
2020/06/15 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
演讲稿怎么写
2014/01/07 职场文书
愚人节活动策划方案
2014/03/11 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB
在CSS中使用when/else的方法
2022/01/18 HTML / CSS
golang的文件创建及读写操作
2022/04/14 Golang
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers