感谢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” 博客,转载请与作者联系!
原文:http://chronosphere.blog.51cto.com/9598252/1614668