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 相关文章推荐
快速保存网页中所有图片的方法
Jun 23 Javascript
IE6弹出“已终止操作”的解决办法
Nov 27 Javascript
javascript延时加载之defer测试
Dec 28 Javascript
Jquery uploadify图片上传插件无法上传的解决方法
Dec 16 Javascript
JavaScript中使用Callback控制流程介绍
Mar 16 Javascript
简单介绍JavaScript中字符串创建的基本方法
Jul 07 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 Javascript
文件上传的几个示例分享【推荐】
Dec 16 Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 Javascript
简单谈谈React中的路由系统
Jul 25 Javascript
手挽手带你学React之React-router4.x的使用
Feb 14 Javascript
Vue项目开发常见问题和解决方案总结
Sep 11 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
对于PHP 5.4 你必须要知道的
2013/08/07 PHP
php上传文件问题汇总
2015/01/30 PHP
ThinkPHP使用Smarty第三方插件方法小结
2016/03/19 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
javascript event 事件解析
2011/01/31 Javascript
最短的IE判断代码
2011/03/13 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
基于jQuery的左滑出现删除按钮的示例
2017/08/29 jQuery
微信小程序模版渲染详解
2018/01/26 Javascript
用实例解释Python中的继承和多态的概念
2015/04/27 Python
python实现简易通讯录修改版
2018/03/13 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
python3解析库pyquery的深入讲解
2018/06/26 Python
python按照多个条件排序的方法
2019/02/08 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
电大学习个人自我评价范文
2013/10/04 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
条幅标语大全
2014/06/20 职场文书
2014年教育实习工作总结
2014/11/22 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
法制工作总结2015
2015/07/23 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript