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

来源:互联网 发布:手机强制视频软件 编辑:程序博客网 时间:2024/05/17 06:41
  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>