在ajax應(yīng)用中,通常一個頁面要同時發(fā)送多個請求,如果只有一個XMLHttpRequest對象,前面的請求還未完成,后面的就會把前面的覆蓋掉,如果每次都創(chuàng)建一個新的XMLHttpRequest對象,也會造成浪費。解決的辦法就是創(chuàng)建一個XMLHttpRequset的對象池,如果池里有空閑的對象,則使用此對象,否則將創(chuàng)建一個新的對象。
/**
?*?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 ;
????},
???? //?發(fā)送請求(方法[post,get],?地址,?數(shù)據(jù),?回調(diào)函數(shù))
???? sendReq :?function?( method ,? url ,? data ,? callback )
????{
????????var? objXMLHttp? =? this . _getInstance ();
???????? with ( objXMLHttp )
????????{
???????????? try
???????????? {
???????????????? //?加隨機數(shù)防止緩存
???????????????? if?( url . indexOf ( "?" )?>? 0 )
????????????????{
???????????????????? url? +=? "&randnum="? +? Math . random ();
????????????????}
????????????????else
????????????????{
???????????????????? url? +=? "?randnum="? +? Math . random ();
????????????????}
???????????????? open ( method ,? url ,? true );
???????????????? //?設(shè)定請求編碼方式
???????????????? 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 );
????????????}
????????}
????}
};?
?*?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 ;
????},
???? //?發(fā)送請求(方法[post,get],?地址,?數(shù)據(jù),?回調(diào)函數(shù))
???? sendReq :?function?( method ,? url ,? data ,? callback )
????{
????????var? objXMLHttp? =? this . _getInstance ();
???????? with ( objXMLHttp )
????????{
???????????? try
???????????? {
???????????????? //?加隨機數(shù)防止緩存
???????????????? if?( url . indexOf ( "?" )?>? 0 )
????????????????{
???????????????????? url? +=? "&randnum="? +? Math . random ();
????????????????}
????????????????else
????????????????{
???????????????????? url? +=? "?randnum="? +? Math . random ();
????????????????}
???????????????? open ( method ,? url ,? true );
???????????????? //?設(shè)定請求編碼方式
???????????????? 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>?
<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>?
源代碼里有中文的注釋,是ansi的,如果你的網(wǎng)站或ie下選擇編碼為UTF-8,可能會導(dǎo)致錯誤,你把你ie的編碼改成gb2312看看,或者去掉文件里的中文注釋