建立一个pool来管理页面上的xmlhttp对象实例,最明显的好处就是不会再创建冗余对象,同时也不会出现多个操作在同一个工作的xmlhttp实例上被调用的情况。
具体实现,我们使用一个Array作为pool来存储已创建的xmlhttp对象实例,然后每次调用从pool中去取一个实例。xmlhttp实例通讯完 毕后我们不用做任何处置,因为它自身的readyState属性可以标识出它是否可用,如果当时没有空闲的xmlhttp实例,且pool中的实例数小于 m_MaxPoolLength,那么就创建一个新的实例并放入pool中。pool的实现代码如下:
#region __XmlHttpPool__源码
var __XmlHttpPool__ =
{
m_MaxPoolLength : 10,
m_XmlHttpPool : [],
__requestObject : function()
{
xmlhttp null;
pool this.m_XmlHttpPool;
for ( i0 ; i < pool.length ; ++i )
{
if ( pool[i].readyState ==4|| pool[i].readyState )
{
xmlhttp pool[i];
break;
}
}
( xmlhttp )
{
return.__extendPool();
}
xmlhttp;
},
__extendPool : .m_XmlHttpPool.length .m_MaxPoolLength )
{
;
try
{
xmlhttp new ActiveXObject('MSXML2.XMLHTTP');
}
catch(e)
{
{
xmlhttp ActiveXObject('Microsoft.XMLHTTP');
}
(e2) {}
}
( xmlhttp )
{
.m_XmlHttpPool.push(xmlhttp);
}
xmlhttp;
}
},
GetRemoteData : (url, callback)
{
.__receiveRemoteData(url, callback, 'GET', );
},
PostRemoteData : {
},
__receiveRemoteData : .__requestObject();
!xmlhttp )
{
;
}
xmlhttp.open(httpmethod, url,255);">true);
xmlhttp.onreadystatechange ()
{
( xmlhttp.readyState xmlhttp.readyState 'complete' )
{
callback(xmlhttp.responseText);
}
};
xmlhttp.send(data);
}
};
#endregion
var __XmlHttpPool__ =
{
m_MaxPoolLength : 10,
m_XmlHttpPool : [],
__requestObject : function()
{
xmlhttp null;
pool this.m_XmlHttpPool;
for ( i0 ; i < pool.length ; ++i )
{
if ( pool[i].readyState ==4|| pool[i].readyState )
{
xmlhttp pool[i];
break;
}
}
( xmlhttp )
{
return.__extendPool();
}
xmlhttp;
},
__extendPool : .m_XmlHttpPool.length .m_MaxPoolLength )
{
;
try
{
xmlhttp new ActiveXObject('MSXML2.XMLHTTP');
}
catch(e)
{
{
xmlhttp ActiveXObject('Microsoft.XMLHTTP');
}
(e2) {}
}
( xmlhttp )
{
.m_XmlHttpPool.push(xmlhttp);
}
xmlhttp;
}
},
GetRemoteData : (url, callback)
{
.__receiveRemoteData(url, callback, 'GET', );
},
PostRemoteData : {
},
__receiveRemoteData : .__requestObject();
!xmlhttp )
{
;
}
xmlhttp.open(httpmethod, url,255);">true);
xmlhttp.onreadystatechange ()
{
( xmlhttp.readyState xmlhttp.readyState 'complete' )
{
callback(xmlhttp.responseText);
}
};
xmlhttp.send(data);
}
};
#endregion
__XmlHttpPool__提供了两个方法来和服务器通信,一个使用'GET'方法,一个使用'POST'方法,使用它们非常简单, __XmlHttpPool__.GetRemoteData(url,callback)或__XmlHttpPool__.PostRemoteData(url,callback,data)。其中url是服务器地址,callback是处理返回数据(responseText)的回调函数。比如:
<
script
language
="javascript"
>
<textarea rows="40" style=width:100% id="txbContent"></textarea>
__XmlHttpPool__.PostRemoteData(url, Render, 'abc');
function Render(string)
{
if ( string )
{
txbContent.value += string + '/r/n';
}
}
</scirpt> function Render(string)
{
if ( string )
{
txbContent.value += string + '/r/n';
}
}
<textarea rows="40" style=width:100% id="txbContent"></textarea>