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

下面是我最近写的一个简单的类:

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