html5中文学习网

您的位置: 首页 > 网站及特效实例 > javascript特效 » 正文

jQuery的ready方法详解_jquery_

[ ] 已经帮助:人解决问题

jQuery中的ready方法实现了当页面加载完成后才执行的效果,但他并不是window.onload或者doucment.onload的封装,而是使用 标准W3C浏览器DOM隐藏api和IE浏览器缺陷来完成的,首先,我们来看jQuery的代码8bjHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
8bjHTML5中文学习网 - HTML5先行者学习网
DOMContentLoaded = function() 8bjHTML5中文学习网 - HTML5先行者学习网
 { 8bjHTML5中文学习网 - HTML5先行者学习网
         //取消事件监听,执行ready方法     if ( document.addEventListener ) 8bjHTML5中文学习网 - HTML5先行者学习网
    {      8bjHTML5中文学习网 - HTML5先行者学习网
        document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 8bjHTML5中文学习网 - HTML5先行者学习网
        jQuery.ready(); 8bjHTML5中文学习网 - HTML5先行者学习网
    } 8bjHTML5中文学习网 - HTML5先行者学习网
     else if ( document.readyState === "complete" )  8bjHTML5中文学习网 - HTML5先行者学习网
    { 8bjHTML5中文学习网 - HTML5先行者学习网
        document.detachEvent( "onreadystatechange", DOMContentLoaded ); 8bjHTML5中文学习网 - HTML5先行者学习网
        jQuery.ready(); 8bjHTML5中文学习网 - HTML5先行者学习网
    } 8bjHTML5中文学习网 - HTML5先行者学习网
};8bjHTML5中文学习网 - HTML5先行者学习网
8bjHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
8bjHTML5中文学习网 - HTML5先行者学习网
jQuery.ready.promise = function( obj ) { 8bjHTML5中文学习网 - HTML5先行者学习网
    if ( !readyList ) { 8bjHTML5中文学习网 - HTML5先行者学习网
        readyList = jQuery.Deferred(); 8bjHTML5中文学习网 - HTML5先行者学习网
            //表示页面已经加载完成,直接调用 ready方法         if ( document.readyState === "complete" ) {  8bjHTML5中文学习网 - HTML5先行者学习网
            //将 jQuery.ready压入异步消息队列,设置延迟时间1毫秒(注意,有些浏览器延迟不能小于4毫秒)             setTimeout( jQuery.ready);  8bjHTML5中文学习网 - HTML5先行者学习网
        }  8bjHTML5中文学习网 - HTML5先行者学习网
        else if ( document.addEventListener ) //         { 8bjHTML5中文学习网 - HTML5先行者学习网
             //监听DOM加载完成             document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); 8bjHTML5中文学习网 - HTML5先行者学习网
             //这里是为了确保所有ready执行结束,如果DOMContentLoaded方法执行了,将有一个状态值 isReady被设置为true,因此,              //ready方法一旦执行,那么将只执行一次,window.addEventListener中的ready 将被 return 中断             window.addEventListener( "load", jQuery.ready, false ); 8bjHTML5中文学习网 - HTML5先行者学习网
        } else { 8bjHTML5中文学习网 - HTML5先行者学习网
            //低版本的IE浏览器             document.attachEvent( "onreadystatechange", DOMContentLoaded ); 8bjHTML5中文学习网 - HTML5先行者学习网
            window.attachEvent( "onload", jQuery.ready ); 8bjHTML5中文学习网 - HTML5先行者学习网
            var top = false; 8bjHTML5中文学习网 - HTML5先行者学习网
            try { 8bjHTML5中文学习网 - HTML5先行者学习网
                top = window.frameElement == null && document.documentElement; 8bjHTML5中文学习网 - HTML5先行者学习网
            } catch(e) {} 8bjHTML5中文学习网 - HTML5先行者学习网
            if ( top && top.doScroll )  //剔除iframe的成分             { 8bjHTML5中文学习网 - HTML5先行者学习网
                (function doScrollCheck() { 8bjHTML5中文学习网 - HTML5先行者学习网
                    if ( !jQuery.isReady ) { 8bjHTML5中文学习网 - HTML5先行者学习网
                        try { 8bjHTML5中文学习网 - HTML5先行者学习网
                            //根据bug来兼容低版本的IE http://javascript.nwbox.com/IEContentLoaded/                             top.doScroll("left"); 8bjHTML5中文学习网 - HTML5先行者学习网
                        } catch(e) { 8bjHTML5中文学习网 - HTML5先行者学习网
                            //由于低版本的IE 浏览器,onreadystatechange事件不可靠,因此需要根据各个bug来判断页面是否已加载完成                             return setTimeout( doScrollCheck, 50 );  8bjHTML5中文学习网 - HTML5先行者学习网
                        } 8bjHTML5中文学习网 - HTML5先行者学习网
                        jQuery.ready(); 8bjHTML5中文学习网 - HTML5先行者学习网
                    } 8bjHTML5中文学习网 - HTML5先行者学习网
                })(); 8bjHTML5中文学习网 - HTML5先行者学习网
            } 8bjHTML5中文学习网 - HTML5先行者学习网
        } 8bjHTML5中文学习网 - HTML5先行者学习网
    } 8bjHTML5中文学习网 - HTML5先行者学习网
    return readyList.promise( obj ); 8bjHTML5中文学习网 - HTML5先行者学习网
};8bjHTML5中文学习网 - HTML5先行者学习网
8bjHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
8bjHTML5中文学习网 - HTML5先行者学习网
ready: function( wait )8bjHTML5中文学习网 - HTML5先行者学习网
 {8bjHTML5中文学习网 - HTML5先行者学习网
 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 8bjHTML5中文学习网 - HTML5先行者学习网
  //判断页面是否已完成加载并且是否已经执行ready方法8bjHTML5中文学习网 - HTML5先行者学习网
  return;8bjHTML5中文学习网 - HTML5先行者学习网
 }8bjHTML5中文学习网 - HTML5先行者学习网
 if ( !document.body ) {8bjHTML5中文学习网 - HTML5先行者学习网
  return setTimeout( jQuery.ready );8bjHTML5中文学习网 - HTML5先行者学习网
 }8bjHTML5中文学习网 - HTML5先行者学习网
 jQuery.isReady = true; //指示ready方法已被执行8bjHTML5中文学习网 - HTML5先行者学习网
 if ( wait !== true && --jQuery.readyWait > 0 ) {8bjHTML5中文学习网 - HTML5先行者学习网
  return;8bjHTML5中文学习网 - HTML5先行者学习网
 }8bjHTML5中文学习网 - HTML5先行者学习网
 readyList.resolveWith( document, [ jQuery ] );8bjHTML5中文学习网 - HTML5先行者学习网
 if ( jQuery.fn.trigger ) {8bjHTML5中文学习网 - HTML5先行者学习网
  jQuery( document ).trigger("ready").off("ready"); 8bjHTML5中文学习网 - HTML5先行者学习网
 }8bjHTML5中文学习网 - HTML5先行者学习网
},8bjHTML5中文学习网 - HTML5先行者学习网
8bjHTML5中文学习网 - HTML5先行者学习网

总结:8bjHTML5中文学习网 - HTML5先行者学习网

 页面加载完成有两种事件,一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件),二是onload,指示页 面包含图片等文件在内的所有元素都加载完成。(可以说:ready 在onload 前加载!!!)8bjHTML5中文学习网 - HTML5先行者学习网
一般样式控制的,比如图片大小控制放在onload 里面加载;8bjHTML5中文学习网 - HTML5先行者学习网
jS事件触发的方法,可以在ready 里面加载;8bjHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助