zoukankan      html  css  js  c++  java
  • JavaScript一个whenReady函数,监听及注册事件

    /**
    * 传递函数给whenReady(),当文档解析完成且为操作准备就绪时,
    * 函数将作为文档对象的方法调用
    * DOMContentLoaded、readystatechange或load事件发生时会触发注册函数
    * 一旦文档准备就绪,所有函数都将被调用、任何传递给whenReady()的函数都将立即调用
     */
    
    var whenReady =(function(){		//这个函数返回whenReady()函数
    	var funcs = [];				//当获得事件时,要运行的函数
    	var ready = false;			//当触发事件处理程序时,切换到true
    
    	//当文档准备就绪时,调用事件处理程序
    	function handler(e){
    		//如果已经运行过一次,只需要放回
    		if(ready)
    			return;
    
    		//如果发生readystatechange事件
    		//但其状态不是“complete”的话,那么文档尚未准备好
    		if(e.type === "readystatechange" && document.readyState !=="complete")
    			return ;
    		//运行所有注册函数
    		//注意每次都要计算funcs.length
    		//以防这些函数调用可能会导致注册更多的函数
    		for(var i= 0 ; i < funcs.length ; i++)
    			funcs[i].call(document);
    
    		//现在设置ready标识为true,并移除所有函数
    		ready = true;
    		funcs = null;
    	}
    
    	//为接收到的任何事件注册处理程序
    	if(document.addEventListener){
    		document.addEventListener("DOMContentLoaded",handler,false);
    		document.addEventListener("readystatechange",handler,false);
    		window.addEventListener("load",handler,false);
    	}else if(document.attachEvent){
    		document.attachEvent("onreadystatechange",handler);
    		window.attachEvent("onload",handler);
    	}
    
    	//返回whenReady()函数
    	return function whenReady(f){
    		if(ready) 
    			f.call(document); 	//若准备完毕,只需要运行它
    		else
    			funcs.push(f);		//否则,加入队列等候
    	}
    }());
    

      

  • 相关阅读:
    中国剩余定理(CRT) & 扩展中国剩余定理(ExCRT)总结
    各种求逆元
    A*(A_star)搜索总结
    线段树总结
    C++的STL
    Unable to make the session state request to the session state server处理方法
    判断UserAgent是否来自微信
    VS2010 EntityFramework Database First
    VS2010类似Eclipse文件查找功能-定位到
    Newtonsoft.Json随手记
  • 原文地址:https://www.cnblogs.com/ctsch/p/6921126.html
Copyright © 2011-2022 走看看