AJAX中同时发送多个请求XMLHttpRequest对象处理方法

  1. 在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖 掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有 空闲的对象,则使用此对象,否则将创建一个新的对象。

  2. * XMLHttpRequest Object Pool  
  3. *  
  4. * @author legend <legendsky@hotmail.com>  
  5. * @link http://www.ugia.cn/?p=85   
  6. * @Copyright www.ugia.cn  
  7. */   
  8. var  XMLHttp = {  
  9. _objPool: [],  
  10. _getInstance: function  ()  
  11. {  
  12. for  ( var  i = 0; i <  this ._objPool.length; i ++)  
  13. {  
  14. if  ( this ._objPool[i].readyState == 0 ||  this ._objPool[i].readyState == 4)  
  15. {  
  16. return   this ._objPool[i];  
  17. }  
  18. }  
  19. // IE5中不支持push方法   
  20. this ._objPool[ this ._objPool.length] =  this ._createObj();  
  21. return   this ._objPool[ this ._objPool.length - 1];  
  22. },  
  23. _createObj: function  ()  
  24. {  
  25. if  (window.XMLHttpRequest)  
  26. {  
  27. var  objXMLHttp =  new  XMLHttpRequest();  
  28. }  
  29. else   
  30. {  
  31. var  MSXML = [ 'MSXML2.XMLHTTP.5.0''MSXML2.XMLHTTP.4.0''MSXML2.XMLHTTP.3.0''MSXML2.XMLHTTP''Microsoft.XMLHTTP' ];  
  32. for ( var  n = 0; n < MSXML.length; n ++)  
  33. {  
  34. try   
  35. {  
  36. var  objXMLHttp =  new  ActiveXObject(MSXML[n]);  
  37. break ;  
  38. }  
  39. catch (e)  
  40. {  
  41. }  
  42. }  
  43. }   
  44. // mozilla某些版本没有readyState属性   
  45. if  (objXMLHttp.readyState ==  null )  
  46. {  
  47. objXMLHttp.readyState = 0;  
  48. objXMLHttp.addEventListener("load"function  ()  
  49. {  
  50. objXMLHttp.readyState = 4;  
  51. if  ( typeof  objXMLHttp.onreadystatechange ==  "function" )  
  52. {  
  53. objXMLHttp.onreadystatechange();  
  54. }  
  55. }, false );  
  56. }  
  57. return  objXMLHttp;  
  58. },  
  59. // 发送请求(方法[post,get], 地址, 数据, 回调函数)   
  60. sendReq: function  (method, url, data, callback)  
  61. {  
  62. var  objXMLHttp =  this ._getInstance();  
  63. with (objXMLHttp)  
  64. {  
  65. try   
  66. {  
  67. // 加随机数防止缓存   
  68. if  (url.indexOf( "?" ) > 0)  
  69. {  
  70. url += "&randnum="  + Math.random();  
  71. }  
  72. else   
  73. {  
  74. url += "?randnum="  + Math.random();  
  75. }  
  76. open(method, url, true );  
  77. // 设定请求编码方式   
  78. setRequestHeader('Content-Type''application/x-www-form-urlencoded; charset=UTF-8' );  
  79. send(data);  
  80. onreadystatechange = function  ()  
  81. {  
  82. if  (objXMLHttp.readyState == 4 && (objXMLHttp.status == 200 || objXMLHttp.status == 304))  
  83. {  
  84. callback(objXMLHttp);  
  85. }  
  86. }  
  87. }  
  88. catch (e)  
  89. {  
  90. alert(e);  
  91. }  
  92. }  
  93. }  
  94. };   
  95.   
  96.   
  97. 示例:   
  98.   
  99. <mce:script type="text/javascript"  src= "xmlhttp.js"  mce_src= "xmlhttp.js" ></mce:script>  
  100. <mce:script type="text/javascript" ><!--  
  101. function  test(obj)  
  102. {  
  103. alert(obj.statusText);  
  104. }  
  105. XMLHttp.sendReq('GET''http://www.ugia.cn/wp-data/test.htm''' , test);  
  106. XMLHttp.sendReq('GET''http://www.ugia.cn/wp-data/test.htm''' , test);  
  107. XMLHttp.sendReq('GET''http://www.ugia.cn/wp-data/test.htm''' , test);  
  108. XMLHttp.sendReq('GET''http://www.ugia.cn/wp-data/test.htm''' , test);  
  109. alert('Pool length:'  + XMLHttp._objPool.length);  
  110. // --></mce:script>   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值