同一页面无法多次使用XmlHttp发起Ajax请求的真实原因
当该页面第一次发出Ajax请求的时候可以正常运行,但是从第二次调用开始发现——onreadystatechange()事件再也没有被调用!
于是上Google查了一下,发现还有不少人为此感到困扰,而且发现很多人持有的是这个错误的观点:
他们说这是因为一个XmlHttp只能使用一次send(),每次要使用新的XmlHttp。但是我的XmlHttp是函数内的局部变量,函数执行完毕它就会被销毁啊,而且即使我在函数的开头把它赋值null也没有用。
/*然后我发现一个十分有意义的帖子
*/
原来是这个原因,由于IE浏览器有缓存,第一次发送的Ajax请求确实被发送出去了,也接收到了回应,所以就触发了onreadystatechange()事件。但是从 第二次起IE浏览器发现缓存里面已经有请求的页面,于是Ajax请求将不再被发送出去,这样当然也不会触发onreadystatechange()事件了。所以只要我 们在Url里加上+"&"+Math.random()就可以避免这个问题。当我做了这样修改后果真就可以在同一页面多次使用XmlHttp发起Ajax请求了。接着我把xmlhttp = null删除掉也仍然可以正常运行了。 附代码如下: <script type="text/javascript"> function createXHR() { if (window.XMLHttpRequest) { return new XMLHttpRequest(); } if (window.ActiveXObject) { var msxmls = ['MSXML3','MSXML2','Microsoft'] for (var i=0; i < msxmls.length; i++) { try { return new ActiveXObject(msxmls[i]+'.XMLHTTP') } catch (e) { } } throw new Error("No XML component installed!") } } </script> <script type="text/javascript"> function refreshComment() { var xmlhttp = createXHR(); var xmlhttpUrl = "flash.aspx?ajax=refresh&"+Math.random(); xmlhttp.open("GET",xmlhttpUrl,true); xmlhttp.send(null); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) { // alert("xmlhttp.status = " + xmlhttp.status); // alert("xmlhttp.readyState = " + xmlhttp.readyState); divCommentList.innerHTML=xmlhttp.responseText; } } } } </script>
原文链接:https://www.f2er.com/ajax/165102.html于是上Google查了一下,发现还有不少人为此感到困扰,而且发现很多人持有的是这个错误的观点:
他们说这是因为一个XmlHttp只能使用一次send(),每次要使用新的XmlHttp。但是我的XmlHttp是函数内的局部变量,函数执行完毕它就会被销毁啊,而且即使我在函数的开头把它赋值null也没有用。
/*然后我发现一个十分有意义的帖子
*/
原来是这个原因,由于IE浏览器有缓存,第一次发送的Ajax请求确实被发送出去了,也接收到了回应,所以就触发了onreadystatechange()事件。但是从 第二次起IE浏览器发现缓存里面已经有请求的页面,于是Ajax请求将不再被发送出去,这样当然也不会触发onreadystatechange()事件了。所以只要我 们在Url里加上+"&"+Math.random()就可以避免这个问题。当我做了这样修改后果真就可以在同一页面多次使用XmlHttp发起Ajax请求了。接着我把xmlhttp = null删除掉也仍然可以正常运行了。 附代码如下: <script type="text/javascript"> function createXHR() { if (window.XMLHttpRequest) { return new XMLHttpRequest(); } if (window.ActiveXObject) { var msxmls = ['MSXML3','MSXML2','Microsoft'] for (var i=0; i < msxmls.length; i++) { try { return new ActiveXObject(msxmls[i]+'.XMLHTTP') } catch (e) { } } throw new Error("No XML component installed!") } } </script> <script type="text/javascript"> function refreshComment() { var xmlhttp = createXHR(); var xmlhttpUrl = "flash.aspx?ajax=refresh&"+Math.random(); xmlhttp.open("GET",xmlhttpUrl,true); xmlhttp.send(null); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) { if (xmlhttp.status == 200) { // alert("xmlhttp.status = " + xmlhttp.status); // alert("xmlhttp.readyState = " + xmlhttp.readyState); divCommentList.innerHTML=xmlhttp.responseText; } } } } </script>