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 面向对象思想 附源码
Jul 07 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
Jun 21 Javascript
图标线性回归斜着移动到指定的位置
Aug 16 Javascript
详解jQuery插件开发中的extend方法
Nov 19 Javascript
详解JavaScript中的Unescape()和String() 函数
Nov 09 Javascript
深入解析JavaScript中函数的Currying柯里化
Mar 19 Javascript
异步加载JS、CSS代码(推荐)
Jun 15 Javascript
JavaScript中数组的各种操作的总结(必看篇)
Feb 13 Javascript
node.js express中app.param的用法详解
Jul 16 Javascript
使用JS判断页面是首次被加载还是刷新
May 26 Javascript
JS+CSS实现3D切割轮播图
Mar 21 Javascript
Vue微信公众号网页分享的示例代码
May 28 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
多重?l件?合查?(一)
2006/10/09 PHP
php 生成文字png图片的代码
2011/04/17 PHP
php中用数组的方法设置cookies
2011/04/21 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
PHP的魔术常量__METHOD__简介
2014/07/08 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
datagrid框架的删除添加与修改
2013/04/08 Javascript
Javascript简单实现可拖动的div
2013/10/22 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
JavaScript程序开发之JS代码放置的位置
2016/01/15 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
Python获取网页上图片下载地址的方法
2015/03/11 Python
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
Python3中函数参数传递方式实例详解
2019/05/05 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
python interpolate插值实例
2020/07/06 Python
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
几个判断型的面试题
2012/07/03 面试题
安全员岗位职责
2013/11/11 职场文书
小学课外阅读总结
2014/07/09 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
2015年采购工作总结
2015/04/10 职场文书
旗帜观后感
2015/06/08 职场文书