• jQuery的ready方法实现原理分析


    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"); 
      }
    },
  • 相关阅读:
    elk
    js时间处理
    idea首次提交项目
    kafka集群zookeeper集群详细配置
    单节点多节点等等详细解释
    kafka原理存储
    Thread-0" kafka.common.FailedToSendMessageException: Failed to send messages after 3 tries.
    如何使用JMeter开源性能测试工具来构建Web性能测试体系
    自动化测试的理解
    VBS教程
  • 原文地址:https://www.cnblogs.com/baocheng/p/5707008.html
Copyright © 2020-2023  润新知