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 布尔型分析
Dec 22 Javascript
JQUERY设置IFRAME的SRC值的代码
Nov 30 Javascript
用jquery实现自定义风格的滑动条实现代码
Apr 26 Javascript
js弹出div并显示遮罩层
Feb 12 Javascript
Vue表单验证插件Vue Validator使用方法详解
Apr 07 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
Apr 26 Javascript
vue.js中父组件调用子组件的内部方法示例
Oct 22 Javascript
浅析从vue源码看观察者模式
Jan 29 Javascript
webpack配置打包后图片路径出错的解决
Apr 26 Javascript
详解vue配置后台接口方式
Mar 29 Javascript
十分钟教你上手ES2020新特性
Feb 12 Javascript
react-router-dom 嵌套路由的实现
May 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
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
php分享朋友圈的实现代码
2019/02/18 PHP
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
JS原型与继承操作示例
2019/05/09 Javascript
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
python中元类用法实例
2014/10/10 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
美国轮胎网站:Priority Tire
2018/11/28 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
自荐信范文
2013/12/10 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
新闻专业学生的自我评价
2014/02/13 职场文书
就业协议书
2014/09/12 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
经理聘任证明
2015/03/02 职场文书
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技