同一页面无法多次使用XmlHttp发起Ajax请求的真实原因

最近在一项任务中,团队老大要求我使用Ajax避免影响用户体验,于是我开始了Ajax的征程,虽说Ajax本身不难,但是我还是遇到了一些问题:当该页面第一次发出Ajax请求的时候可以正常运行,但是从第二次调用开始我惊奇的发现——onreadystatechange()事件再也没有被调用!
于是我上Google查了一下,发现还有不少人为此感到困扰,而且发现很多人持有的是这个错误的观点:
他们说这是因为一个XmlHttp只能使用一次send(),每次要使用新的XmlHttp。但是我的XmlHttp是函数内的局部变量,函数执行完毕它就会被销毁啊,而且即使我在函数的开头把它赋值null也没有用。
/*然后我发现一个十分有意义的帖子
*/
原来是这个原因,由于IE浏览器有缓存,第一次发送的Ajax请求确实被发送出去了,也接收到了回应,所以就触发了onreadystatechange()事件。但是从第二次起IE浏览器发现缓存里面已经有请求的页面,于是Ajax请求将不再被发送出去,这样当然也不会触发onreadystatechange()事件了。所以只要我们在Url里加上+"&"+Math.random()就可以避免这个问题。当我做了这样修改后果真就可以在同一页面多次使用XmlHttp发起Ajax请求了。接着我把xmlhttp = null删除掉也仍然可以正常运行了。
附代码如下:
  1. <script type="text/javascript">
  2. function createXHR() {
  3.     if (window.XMLHttpRequest) {
  4.         return new XMLHttpRequest();
  5.     }
  6.     if (window.ActiveXObject) {
  7.         var msxmls = ['MSXML3''MSXML2''Microsoft']
  8.         for (var i=0; i < msxmls.length; i++) {
  9.             try {
  10.                 return new ActiveXObject(msxmls[i]+'.XMLHTTP')
  11.             } catch (e) { }
  12.         }
  13.         throw new Error("No XML component installed!")
  14.     }
  15. }
  16. </script>
  17. <script type="text/javascript">
  18. function refreshComment() {
  19.     var xmlhttp = createXHR();
  20.     var xmlhttpUrl = "flash.aspx?ajax=refresh&"+Math.random();
  21.     xmlhttp.open("GET", xmlhttpUrl, true);
  22.     xmlhttp.send(null);
  23.     xmlhttp.onreadystatechange = function () {
  24.         if (xmlhttp.readyState == 4) {
  25.             if (xmlhttp.status == 200) {
  26. //                alert("xmlhttp.status = " + xmlhttp.status);
  27. //                alert("xmlhttp.readyState = " + xmlhttp.readyState);
  28.                divCommentList.innerHTML=xmlhttp.responseText;
  29.             }
  30.         }
  31.     }
  32. }
  33. </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值