在ajax应用中
通常一个页面要同时发送多个请求
如果只有一个XMLHttpRequest对象
前面的请求还未完成
后面的就会把前面的覆盖掉
如果每次都创建一个新的XMLHttpRequest对象
也会造成浪费
解决的办法就是创建一个XMLHttpRequset的对象池
如果池里有空闲的对象
则使用此对象
否则将创建一个新的对象
下面是我最近写的一个简单的类
/**
* XMLHttpRequest Object Pool
*
* @author legend <l>
* @link
* @Copyright
*/
var XMLHttp = {
_objPool: []
_getInstance: function ()
{
for (var i = ; i < this_objPoollength; i ++)
{
if (this_objPool[i]readyState == || this_objPool[i]readyState == )
{
return this_objPool[i];
}
}
// IE中不支持push方法
this_objPool[this_objPoollength] = this_createObj();
return this_objPool[this_objPoollength ];
}
_createObj: function ()
{
if (windowXMLHttpRequest)
{
var objXMLHttp = new XMLHttpRequest();
}
else
{
var MSXML = [MSXMLXMLHTTP MSXMLXMLHTTP MSXMLXMLHTTP MSXMLXMLHTTP MicrosoftXMLHTTP];
for(var n = ; n < MSXMLlength; n ++)
{
try
{
var objXMLHttp = new ActiveXObject(MSXML[n]);
break;
}
catch(e)
{
}
}
}
// mozilla某些版本没有readyState属性
if (objXMLHttpreadyState == null)
{
objXMLHttpreadyState = ;
objXMLHttpaddEventListener(load function ()
{
objXMLHttpreadyState = ;
if (typeof objXMLHttponreadystatechange == function)
{
objXMLHttponreadystatechange();
}
} false);
}
return objXMLHttp;
}
// 发送请求(方法[postget] 地址 数据 回调函数)
sendReq: function (method url data callback)
{
var objXMLHttp = this_getInstance();
with(objXMLHttp)
{
try
{
// 加随机数防止缓存
if (urlindexOf(?) > )
{
url += &randnum= + Mathrandom();
}
else
{
url += ?randnum= + Mathrandom();
}
open(method url true);
// 设定请求编码方式
setRequestHeader(ContentType application/xwwwformurlencoded; charset=UTF);
send(data);
onreadystatechange = function ()
{
if (objXMLHttpreadyState == && (objXMLHttpstatus == || objXMLHttpstatus == ))
{
callback(objXMLHttp);
}
}
}
catch(e)
{
alert(e);
}
}
}
};
示例
<script type=text/JavaScript src=xmlhttpjs></script>
<script type=text/Javascript>
function test(obj)
{
alert(objstatusText);
}
XMLHttpsendReq(GET test);
XMLHttpsendReq(GET test);
XMLHttpsendReq(GET test);
XMLHttpsendReq(GET test);
alert(Pool length: + XMLHttp_objPoollength);
</script>