在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>
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器