posts - 22,comments - 35,trackbacks - 0

          在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 );
          ????????????}
          ????????}
          ????}
          };?

          示例:

          < 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的,如果你的網(wǎng)站或ie下選擇編碼為UTF-8,可能會導(dǎo)致錯誤,你把你ie的編碼改成gb2312看看,或者去掉文件里的中文注釋

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

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




          Java架構(gòu)俱樂部,QQ群2826942 ,交流Java架構(gòu),領(lǐng)域模型,設(shè)計模式,AOP,IOC,輕量級,DDD,項目管理,設(shè)計思想等問題,聚集經(jīng)驗豐富的高級程序員,架構(gòu)師,項目經(jīng)理等交流以上層面較高的問題。歡迎各位有識之士加入,共同探討、發(fā)表高見、廣結(jié)精英。為了使各位成員免受無聊信息和低端問題的打擾,請盡量避免討論代碼實現(xiàn)等入門級問題,維護(hù)本群的氛圍和討論質(zhì)量。新手勿加  回復(fù)  更多評論
            
          主站蜘蛛池模板: 安溪县| 大竹县| 阿拉善盟| 繁昌县| 石林| 慈利县| 山西省| 子长县| 邹平县| 同仁县| 临西县| 高青县| 喀什市| 漠河县| 虞城县| 岳池县| 凤山县| 自贡市| 蒲江县| 平泉县| 阿克陶县| 洞口县| 犍为县| 宜州市| 淮安市| 陵水| 安化县| 长治县| 台中县| 自贡市| 故城县| 太湖县| 元谋县| 沂水县| 盐池县| 阿巴嘎旗| 分宜县| 横山县| 新闻| 泗洪县| 龙岩市|