连续多次发送Ajax前面的请求被后面的覆盖以致不能执行的问题
感谢 http://www.jb51.net/article/27610.htm 的文章《ajax同步请求和异步请求的差异分析》。不过在遇到并解决这个问题之前我也还没有分清同步异步的差异咳咳~
function fetchdata(cat,str) {var xmlHttp;//问题就在这里 xmlHttp=GetXmlHttpObject(); var url; if(xmlHttp==null) { alert("browser doesn‘t support HTTP Request"); return; } switch(cat) { case "n": url = "getcompany.php?sid="+Math.random();break; case "c": case "p": url = "getaddress.php?province="+str+"&sid="+Math.random();break; case "m": var obj = document.getElementById("deptselect"); if(obj.value != null && obj.value !="undefined" && obj.value != "") { alert(obj.value) setCookie(‘deptname‘,obj.options[obj.selectedIndex].text,365); setCookie(‘deptid‘,str,365); } case "d": url = "deptvsmem.php?deptid="+str+"&sid="+Math.random();break; } alert(url) xmlHttp.onreadystatechange =function() {//异步调用是否成功 if(xmlHttp.readyState==4 || xmlHttp.readyState=="complete") { if(xmlHttp.status==200 || xmlHttp.status==0) { var sel;var vnum; var str = xmlHttp.responseText; alert(str) switch(str.charAt(0)) { case "p": sel = "provinceselect";vnum = 1;break; case "c": sel = "cityselect";vnum = 1;break; case "n": sel = "comselect";vnum = 1;break; case "d": sel = "deptselect";vnum = 2;break; case "m": sel = "memselect";vnum = 2;break; } str = str.substr(1); BuildSel(str,document.getElementById(sel),vnum); } } } xmlHttp.open("GET",url); xmlHttp.send(null); }
问题就在于第二行的声明var xmlHTTP,如果放在函数外用作全局变量,就会产生标题的问题,即前面的xhr被后面的请求覆盖以致只能执行最后一条请求。只要把它拿进去就没问题了。。。就!没!问!题!了!!。。。之前看有前辈说是因为在收到xmlHttp.responseText之后没有及时删除,要加delete 而且要设成null,不过亲测即使删除了设成null了还是会覆盖,这样把声明放进函数内之后即使没有删除也没问题了。。。@_@
本文出自 “Chronosphere” 博客,转载请与作者联系!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。