解決之道

          個人日記
          posts - 33, comments - 1, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          [導入]XMLHttpRequest對象池

          Posted on 2008-07-31 14:53 閱讀(121) 評論(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看看,或者去掉文件里的中文注釋



          kelven 2006-11-18 13:38 發表評論

          文章來源:http://www.aygfsteel.com/zhangrenquan/articles/81915.html

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 永春县| 双峰县| 湟源县| 泰顺县| 格尔木市| 峨眉山市| 洪泽县| 南城县| 湟源县| 鄂伦春自治旗| 娱乐| 仪征市| 上犹县| 定南县| 绥中县| 安达市| 桃江县| 东阿县| 平定县| 桐乡市| 左云县| 普宁市| 康平县| 赤峰市| 九寨沟县| 福州市| 桑日县| 玉环县| 留坝县| 无锡市| 三门峡市| 富蕴县| 含山县| 琼海市| 和田县| 大同县| 土默特右旗| 莱芜市| 咸宁市| 淄博市| 莒南县|