AJAX多个请求的处理-ajax对象池

AJAX多个请求的处理

转自:http://blog.csdn.net/lee576/archive/2008/01/07/2029445.aspx 

在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆 盖掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里 有空闲的对象,则使用此对象,否则将创建一个新的对象。 

下面是我最近写的一个简单的类: 
* XMLHttpRequest Object Pool 

* @author     legend <legendsky@hotmail.com> 
* @link       http://www.ugia.cn/?p=85 
* @Copyright www.ugia.cn 
*/ 
var XMLHttp = { 
_objPool: [], 
_getInstance: function () 

for (var i = 0; i < this._objPool.length; i ++) 

if (this._objPool[i].readyState == 0 || this._objPool[i].readyState == 4) 

return this._objPool[i]; 


// IE5中不支持push方法 
this._objPool[this._objPool.length] = this._createObj(); 
return this._objPool[this._objPool.length - 1]; 
}, 
_createObj: function () 

if (window.XMLHttpRequest) 

var objXMLHttp = new XMLHttpRequest(); 

else 

var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP']; 
for(var n = 0; n < MSXML.length; n ++) 

try 

var objXMLHttp = new ActiveXObject(MSXML[n]); 
break; 

catch(e) 



}          
// mozilla某些版本没有readyState属性 
if (objXMLHttp.readyState == null) 

objXMLHttp.readyState = 0; 
objXMLHttp.addEventListener("load", function () 

objXMLHttp.readyState = 4; 
if (typeof objXMLHttp.onreadystatechange == "function") 

objXMLHttp.onreadystatechange(); 

},  false); 

return objXMLHttp; 
}, 
// 发送请求(方法[post,get], 地址, 数据, 回调函数) 
sendReq: function (method, url, data, callback) 

var objXMLHttp = this._getInstance(); 
with(objXMLHttp) 

try 

// 加随机数防止缓存 
if (url.indexOf("?") > 0) 

url += "&randnum=" + Math.random(); 

else 

url += "?randnum=" + Math.random(); 

open(method, url, true); 
// 设定请求编码方式 
setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 
send(data); 
onreadystatechange = function () 

if (objXMLHttp.readyState == 4 && (objXMLHttp.status == 200 || objXMLHttp.status == 304)) 

callback(objXMLHttp); 



catch(e) 

alert(e); 



}; 

示例: 
<script type="text/javascript" src="xmlhttp.js"></script> 
<script type="text/javascript"> 
function test(obj) 

alert(obj.statusText); 

XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test); 
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test); 
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test); 
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test); 
alert('Pool length:' + XMLHttp._objPool.length); 
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值