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 相关文章推荐
用Javscript实现表单复选框的全选功能
May 25 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
Mar 17 Javascript
Javascript 垃圾收集机制介绍理解
May 14 Javascript
Vue.js每天必学之数据双向绑定
Sep 05 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
Sep 10 Javascript
使用D3.js创建物流地图的示例代码
Jan 27 Javascript
Vue路由切换时的左滑和右滑效果示例
May 29 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
Oct 26 jQuery
JS左右无缝轮播功能完整实例
May 16 Javascript
JS中间件设计模式的深入探讨与实例分析
Apr 11 Javascript
详解JavaScript中分解数字的三种方法
Jan 05 Javascript
uniapp 微信小程序 自定义tabBar 导航
Apr 22 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实现微信公众号企业转账功能
2018/10/01 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
js DataSet数据源处理代码
2010/03/29 Javascript
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
使用JS判断移动端手机横竖屏状态
2018/07/30 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
20多个小事例带你重温ES10新特性(小结)
2019/09/29 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
简单的python后台管理程序
2017/04/13 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
pytorch中torch.max和Tensor.view函数用法详解
2020/01/03 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
python简单实现插入排序实例代码
2020/12/16 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
考博专家推荐信模板
2013/12/02 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
图书室标语
2014/06/21 职场文书
治安消防安全责任书
2014/07/23 职场文书
超市创业计划书
2014/09/15 职场文书
单位更名证明
2015/06/18 职场文书
MySQL七大JOIN的具体使用
2022/02/28 MySQL