posts - 22,comments - 35,trackbacks - 0

          在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>?

          源代碼里有中文的注釋,是ansi的,如果你的網站或ie下選擇編碼為UTF-8,可能會導致錯誤,你把你ie的編碼改成gb2312看看,或者去掉文件里的中文注釋

          posted on 2006-11-18 13:38 kelven 閱讀(424) 評論(1)  編輯  收藏 所屬分類: Ajax

          FeedBack:
          # re: XMLHttpRequest對象池
          2008-03-07 15:16 | wq
          不錯




          Java架構俱樂部,QQ群2826942 ,交流Java架構,領域模型,設計模式,AOP,IOC,輕量級,DDD,項目管理,設計思想等問題,聚集經驗豐富的高級程序員,架構師,項目經理等交流以上層面較高的問題。歡迎各位有識之士加入,共同探討、發表高見、廣結精英。為了使各位成員免受無聊信息和低端問題的打擾,請盡量避免討論代碼實現等入門級問題,維護本群的氛圍和討論質量。新手勿加  回復  更多評論
            
          主站蜘蛛池模板: 乐平市| 轮台县| 库伦旗| 平武县| 邹平县| 长兴县| 方正县| 云阳县| 榆社县| 庆元县| 惠州市| 桓仁| 舒兰市| 泉州市| 美姑县| 兴仁县| 来宾市| 大渡口区| 墨玉县| 贵南县| 琼中| 小金县| 襄城县| 调兵山市| 博野县| 剑河县| 怀宁县| 彭阳县| 永川市| 辽中县| 水城县| 多伦县| 崇左市| 馆陶县| 利津县| 巴塘县| 乃东县| 介休市| 建德市| 乐昌市| 西昌市|