就XMLHttpRequest()对象而言,没关系,问题在于 onreadystatechange ,例如,如果我以这种方式放置代码,它就完美了。
function process(){
var xmlHttp = new XMLHttpRequest();
if(xmlHttp){
xmlHttp.onreadystatechange = function(){
theD = document.getElementById("theD");
if(xmlHttp.readyState == 1){
theD.innerHTML += "Status 1: Server connection established ! <br/>";
}
else if(xmlHttp.readyState == 2){
theD.innerHTML += "Status 2: Request recieved ! <br/>";
}
else if(xmlHttp.readyState == 3){
theD.innerHTML += "Status 3: Processing Request ! <br/>";
}
else if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
var text = xmlHttp.responseText;
theD.innerHTML += "Status 4: Processing Request ! <br/>";
theD.innerHTML += text;
}
else{
alert("Something is wrong !");
}
}
};
xmlHttp.open("GET", "hello.txt", true);
xmlHttp.send();
}
}
但如果我使用 handleServerResponse()
的功能function handleServerResponse(){
theD = document.getElementById("theD");
if(xmlHttp.readyState == 1){
theD.innerHTML += "Status 1: Server connection established ! <br/>";
}
else if(xmlHttp.readyState == 2){
theD.innerHTML += "Status 2: Request recieved ! <br/>";
}
else if(xmlHttp.readyState == 3){
theD.innerHTML += "Status 3: Processing Request ! <br/>";
}
else if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){
var text = xmlHttp.responseText;
theD.innerHTML += "Status 4: Processing Request ! <br/>";
theD.innerHTML += text;
}
else{
alert("Something is wrong !");
}
}
}
并称之为
xmlHttp.onreadystatechange = handleServerResponse();
它不起作用。如果我错了,请指出。
答案 0 :(得分:7)
尝试使用
xmlHttp.onreadystatechange = handleServerResponse;
请注意删除的paranthesis。
答案 1 :(得分:3)
两件事:
xmlHttp.open("GET", "hello.txt", true);
xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send();
如您所见,我删除了括号,然后颠倒了open
和onreadystatechange
的顺序。
首先,是因为否则你没有关联函数引用本身,而是关联函数的返回值 - 因为,基本上,你正在执行它。这有同样的区别:
var a = sum(1, 2); // 3, assign to `a` the return value of `sum`
var b = sum; // assign to `b` the `sum` function ref.
var c = b(1, 2); // 3, therefore `b` is an 'alias' to `sum`
第二件事,它取决于浏览器:例如,每次调用onreadystatechange
方法时,某些版本的IE“重置”XMLHttpRequest
实例的open
。因此,如果您在onreadystatechange
之前设置open
,那就是“初始化器”,那么有一个机会(取决于浏览器)将被移除 - 因此永远不会被调用 - 一旦{{1调用方法。
因此,为了完全兼容,最好在open
方法之后设置onreadystatechange
- 但当然要在open
之前设置。
答案 2 :(得分:1)
使用此 xmlHttp.onreadystatechange = handleServerResponse
然后写为函数handleServerResponse(xmlHttp)它将起作用
答案 3 :(得分:0)
我知道这有点旧,但是我花了几个小时试图使类似的程序在Chrome中工作。
使它起作用的唯一方法是使用result.returncode
对象。
使用全局this
而不是xmlHttp
导致this
仅在handleServerResponse()
时被调用一次。
以下是适用于Google Chrome版本81.0.4044.129(正式版本)(32位)的代码。
xmlHttp.readyState == 2
被调用4次,每次handleServerResponse()
被递增。
通过使用Chrome中的开发人员工具并监视xmlHttp.readyState
对象等创建。
this