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获取div高度的代码
Aug 09 Javascript
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
Jul 19 Javascript
JavaScript 语言基础知识点总结(思维导图)
Nov 10 Javascript
js实现从中间开始往上下展开网页窗口的方法
Mar 02 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
Mar 12 Javascript
three.js绘制地球、飞机与轨迹的效果示例
Feb 28 Javascript
js排序与重组的实例讲解
Aug 28 Javascript
Node.js 中使用 async 函数的方法
Nov 20 Javascript
为vue项目自动设置请求状态的配置方法
Jun 09 Javascript
jquery-ui 进度条功能示例【测试可用】
Jul 25 jQuery
JS中的变量作用域(console版)
Jul 18 Javascript
详解React路由传参方法汇总记录
Nov 29 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:风雨欲来 路在何方?
2006/10/09 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
xtree.js 代码
2007/03/13 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
Javascript中神奇的this
2016/01/20 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
原生JS和jQuery操作DOM对比总结
2017/01/19 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
vue 动态组件用法示例小结
2020/03/06 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
React实现todolist功能
2020/12/28 Javascript
Python中一般处理中文的几种方法
2019/03/06 Python
python自定义时钟类、定时任务类
2021/02/22 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
Html5让容器充满屏幕高度或自适应剩余高度的布局实现
2020/05/14 HTML / CSS
法院实习人员自我鉴定
2013/09/26 职场文书
个人简历自荐信
2013/12/05 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
继承权公证书范本
2015/01/23 职场文书
清洁员岗位职责
2015/02/15 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python