onreadystatechange函数在AJAX中不起作用

时间:2013-10-19 06:47:29

标签: javascript ajax

就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();

它不起作用。如果我错了,请指出。

4 个答案:

答案 0 :(得分:7)

尝试使用

xmlHttp.onreadystatechange = handleServerResponse;

请注意删除的paranthesis。

答案 1 :(得分:3)

两件事:

xmlHttp.open("GET", "hello.txt", true);
xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send();

如您所见,我删除了括号,然后颠倒了openonreadystatechange的顺序。

首先,是因为否则你没有关联函数引用本身,而是关联函数的返回值 - 因为,基本上,你正在执行它。这有同样的区别:

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