解決之道

          個(gè)人日記
          posts - 33, comments - 1, trackbacks - 0, articles - 7
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          在ajax應(yīng)用中,通常一個(gè)頁(yè)面要同時(shí)發(fā)送多個(gè)請(qǐng)求,如果只有一個(gè)XMLHttpRequest對(duì)象,前面的請(qǐng)求還未完成,后面的就會(huì)把前面的覆蓋掉,如果每次都創(chuàng)建一個(gè)新的XMLHttpRequest對(duì)象,也會(huì)造成浪費(fèi)。解決的辦法就是創(chuàng)建一個(gè)XMLHttpRequset的對(duì)象池,如果池里有空閑的對(duì)象,則使用此對(duì)象,否則將創(chuàng)建一個(gè)新的對(duì)象。

          下面是我最近寫(xiě)的一個(gè)簡(jiǎn)單的類(lèi):

          /**
          ?*?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某些版本沒(méi)有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ā)送請(qǐng)求(方法[post,get],?地址,?數(shù)據(jù),?回調(diào)函數(shù))
          ????
          sendReq :?function?( method ,? url ,? data ,? callback )
          ????{
          ????????var?
          objXMLHttp? =? this . _getInstance ();

          ????????
          with ( objXMLHttp )
          ????????{
          ????????????
          try
          ????????????
          {
          ????????????????
          //?加隨機(jī)數(shù)防止緩存
          ????????????????
          if?( url . indexOf ( "?" )?>? 0 )
          ????????????????{
          ????????????????????
          url? +=? "&randnum="? +? Math . random ();
          ????????????????}
          ????????????????else
          ????????????????{
          ????????????????????
          url? +=? "?randnum="? +? Math . random ();
          ????????????????}

          ????????????????
          open ( method ,? url ,? true );

          ????????????????
          //?設(shè)定請(qǐng)求編碼方式
          ????????????????
          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>?

          源代碼里有中文的注釋?zhuān)莂nsi的,如果你的網(wǎng)站或ie下選擇編碼為UTF-8,可能會(huì)導(dǎo)致錯(cuò)誤,你把你ie的編碼改成gb2312看看,或者去掉文件里的中文注釋




          文章來(lái)源:http://www.aygfsteel.com/zhangrenquan/articles/81915.html

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 曲沃县| 阿坝县| 阿合奇县| 台中县| 岳普湖县| 宁强县| 桦川县| 随州市| 麻阳| 吉木萨尔县| 城市| 岢岚县| 景德镇市| 日喀则市| 本溪| 福海县| 雷州市| 桑日县| 新竹县| 曲水县| 永春县| 西丰县| 商洛市| 淮安市| 出国| 个旧市| 沙洋县| 高平市| 华亭县| 宁德市| 称多县| 亳州市| 镇远县| 启东市| 泰和县| 冕宁县| 新平| 台东市| 长白| 岚皋县| 康乐县|