XMLHttpRequest对象池

如果采用和服务器每交互一次就新建一个XMLHttpRequest对象的方式,则会很耗费客户端的内存。
实现XMLHttpRequest对象池的大体思路是:建立一个缓存数组用来存放已经创建好的XMLHttpRequest对象,遇到用户请求需要创建XMLHttpRequest对象时,则先看缓存数组中是否已经有XMLHttpRequest对象空闲,如果有则直接从缓存中取一个试用;如果没有则重新创建一个.
var Try={
	these:function(){
var returnValue;
		for(var i=0,length=arguments.length;i<length;i++){
			var lambda=arguments[i];
			try{
				//如果创建成功,则终止
				returnValue=lambda();
				break;
			}catch(e){}
		}
		return returnValue;
	}
};
var Ajax={
	getTransport:function(){
		//创建一个xmlhttp,直到成功为止
		return Try.these(
			function(){return new XMLHttpRequest()},
			function(){return new ActiveXObject('Msxml2.XMLHTTP')},
			function(){return new XMLHttpRequest('Microsoft.XMLHTTP')}
			
		)||false;
	}
};
var XMLHttp={
	_xmlhttpCache:[],
	_getXmlhttp:function(){
		//判断是否有空闲的XMLHttp
		for(var i=0;i<this._xmlhttpCache.length;i++){
			if(this._xmlhttpCache[i].readyState==0||this._xmlhttpCache[i]==4){
				return this.xmlhttpCache[i];
			}
		}
	//创建一个新的xmlhttp
		this._xmlhttpCache[this._xmlhttpCache.length]==Ajax.getTransport();
		//返回缓存中的一个xmlhttp
		return this._xmlhttpCache[this._xmlhttpCache.length-1];
	},
	send:function(method,url,data,callback){
		var xmlhttp=this._getXmlhttp();
		with(xmlhttp){
			try{
				if(url.indexOf("?")!=-1){//防止缓存
					url+="&requestTime="+(new Date()).getTime();
				}
				else{
					url+="?requestTime="+(new Date()).getTime();
				}
			//采用异步调用的方式
			open(method,url,true);
			//设定请求编码方式
			setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8');
			send(data);
			onreadystatechange=function(){
				if(xmlhttp.readyState==4&&(xmlhttp.status==200||xmlhttp.status==304)){
					//调用回调函数
					callback(xmlhttp);
				}
			}
			}
		}
	}
}


将上述代码单独保存为gd.js文件,然后需要用到它的页面将其引入即可

function ok(){
	XMLHttp.send("get","http://127.0.0.....",null,gf);
	function gf(xmlhttp){
		var msgWeclome=xmlhttp.responseText;
		var msg=document.getElementById("msg");
		msg.innerHTML=msgWeclome;
	}
}






Html引用代码如上,,

上述代码均为手抄,如果有错误自己检查下字段。

猜你喜欢

转载自geek41.iteye.com/blog/1184044