zoukankan      html  css  js  c++  java
  • jQuery中的ready函数

    •  为什么会有ready函数
           在javascript中有window.onload函数,但是这个函数是在页面所有元素都加载完毕才执行的。而图片加载通常需要很长时间,这个ready函数就是可以让javascript函数在图片加载完毕前执行的方法。
            
         通常我们需要操作HTML文档时必须要浏览器将文档模型对象加载完毕才能操作, $(document).ready(fn)d的含义就是   检测DOM对象模型是否加载完毕。
    •   通常如何判断
    对于非IE浏览器通过监听事件DOMContentLoaded就可以了。
            对于IE浏览器通常有两种方法
    1.  检测onreadystatechange事件
                    2.  不断地检测documentElement.doScroll()方法是否可以安全执行
    •   jQuery中如何实现
               1.  ready(fn)   提供给外界的绑定事件的借口。
       源码展示:
    Js代码
    1. ready: function( fn ) {  
    2.         jQuery.bindReady();  //添加监听函数  
    3.   
    4.         if ( jQuery.isReady ) { //如果dom加载完成了  
    5.             fn.call( document, jQuery );  //立刻执行函数  
    6.   
    7.         } else if ( readyList ) {  
    8.             readyList.push( fn );  //否则把函数添加进readyList  
    9.         }  
    10.         return this;  
    11.       },  
    ready: function( fn ) {
    jQuery.bindReady(); //添加监听函数

    if ( jQuery.isReady ) { //如果dom加载完成了
    fn.call( document, jQuery ); //立刻执行函数

    } else if ( readyList ) {
    readyList.push( fn ); //否则把函数添加进readyList
    }
    return this;
    },
     
               2.  jQuery.ready()   执行绑定的函数队列
    jQuery.ready
    Js代码
    1. ready: function() {  
    2.     if ( !jQuery.isReady ) {              
    3.                      if ( !document.body ) {    
    4.             return setTimeout( jQuery.ready, 13 );   
    5.         }  
    6.         jQuery.isReady = true;  //设置isReady  
    7.         if ( readyList ) {  
    8.             var fn, i = 0;  
    9.             while ( (fn = readyList[ i++ ]) ) {  
    10.                 fn.call( document, jQuery );     
    11.             }  
    12.             readyList = null;  
    13.                 }  
    14.   
    15.     if ( jQuery.fn.triggerHandler ) {    
    16.             jQuery( document ).triggerHandler( "ready" );  
    17.         }  
    18.     }  
    19. }  
     ready: function() {
    if ( !jQuery.isReady ) {
       if ( !document.body ) {
    return setTimeout( jQuery.ready, 13 );
    }
    jQuery.isReady = true; //设置isReady
    if ( readyList ) {
    var fn, i = 0;
    while ( (fn = readyList[ i++ ]) ) {
    fn.call( document, jQuery );
    }
    readyList = null;
    }

    if ( jQuery.fn.triggerHandler ) {
    jQuery( document ).triggerHandler( "ready" );
    }
    }
    }
     
               3.  bindReady()   绑定事件监听器的方法 屏蔽了浏览器的差异
     看看bindReady的实现
    Js代码
    1. bindReady: function() {  
    2.     if ( readyBound ) {  //默认为false  
    3.         return;  
    4.     }  
    5.   readyBound = true;  
    6.   
    7. if ( document.readyState === "complete" ) {    
    8.         return jQuery.ready();    
    9.     }  
    10.     if ( document.addEventListener ) {      document.addEventListener("DOMContentLoaded",DOMContentLoaded, false );   
    11.     window.addEventListener( "load", jQuery.ready, false );    
    12.     } else if ( document.attachEvent ) {    
    13.  document.attachEvent("onreadystatechange", DOMContentLoaded);     
    14.         window.attachEvent( "onload", jQuery.ready );    
    15.         var toplevel = false;  
    16.              try {  
    17.             toplevel = window.frameElement == null;    
    18.         } catch(e) {}  
    19.             if ( document.documentElement.doScroll && toplevel ) {  
    20.                 doScrollCheck();   
    21.                     }  
    22.         }  
    23.     }  
    bindReady: function() {
    if ( readyBound ) { //默认为false
    return;
    }
      readyBound = true;

    if ( document.readyState === "complete" ) {
    return jQuery.ready();
    }
    if ( document.addEventListener ) { document.addEventListener("DOMContentLoaded",DOMContentLoaded, false );
    window.addEventListener( "load", jQuery.ready, false );
    } else if ( document.attachEvent ) {
    document.attachEvent("onreadystatechange", DOMContentLoaded);
    window.attachEvent( "onload", jQuery.ready );
    var toplevel = false;
       try {
    toplevel = window.frameElement == null;
    } catch(e) {}
    if ( document.documentElement.doScroll && toplevel ) {
    doScrollCheck();
    }
    }
    }
     
             4.  doScrollCheck() 为IE浏览器测试的方法
               doScrollCheck
    Js代码
    1. function doScrollCheck() {  
    2.     if ( jQuery.isReady ) {  
    3.         return;  
    4.     }  
    5.   
    6.     try {  
    7.         document.documentElement.doScroll("left");  
    8.     } catch( error ) {  
    9.         setTimeout( doScrollCheck, 1 );     
    10.         return;  
    11.     }  
    12.     //不停的执行document.documentElement.doScroll("left")  
    13.     jQuery.ready();  
    14. }  
    function doScrollCheck() {
    if ( jQuery.isReady ) {
    return;
    }

    try {
    document.documentElement.doScroll("left");
    } catch( error ) {
    setTimeout( doScrollCheck, 1 );
    return;
    }
    //不停的执行document.documentElement.doScroll("left")
    jQuery.ready();
    }
     
               4.  DOMContentLoaded()   移除了绑定的DOMContentLoaded监听器,并且调用jQuery.ready()方法
               
               源码展示:
    Js代码
    1. DOMContentLoaded = function() {  
    2.         document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );  
    3.         jQuery.ready();  
    4.     };  
    DOMContentLoaded = function() {
    document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
    jQuery.ready();
    };
     
         参考下面文章:
  • 相关阅读:
    关于重构之Switch的处理【二】
    转,有用
    C#枚举总结和其扩展用法(通过枚举描设置枚举值)
    DataGridView编辑状态和CurrentCellDirtyStateChanged
    C#获取DataGirdView选定子项子控件类型,is,as的用法
    VS2013添加作者注释(C#工程)
    开通博客了 zkh
    CentOS7下在线安装mysql zkh
    设计模式之简单工厂,工厂方法,抽象工厂模式(二) zkh
    asp.net mvc中捕获异常和使用log4net日志记录组件 zkh
  • 原文地址:https://www.cnblogs.com/leelike/p/1939752.html
Copyright © 2011-2022 走看看