0

尽管我喜欢凌晨 2 点的谜团,但我认为最好问一下。

我正在使用 onblur 事件来传递“this”(例如 this = input.password)。出于某种原因,除非我在其中添加一行,否则 handleServerResponse 什么都不做,请看一下:

普通的ajax函数:

function ajaxFunction(obj) 
{
    var button = document.getElementById("submit");
    button.disabled = true;
    button.setAttribute("class", "test");
    var getdate = new Date();  //Used to prevent caching during ajax call
    xmlhttp.onreadystatechange  = handleServerResponse(obj);

    if(xmlhttp) 
    {
    //var input = document.forms["signup_form"].getElementsByTagName("input");
    xmlhttp.open("POST","register_ajax.php",true);

    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    xmlhttp.send(obj.name +"="+ obj.value);
    };
}

处理服务器响应 - 不起作用

function handleServerResponse(obj) 
{
    if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200) 
    {
            obj.value=xmlhttp.responseText; //Update the HTML Form element 
    }
    else 
    {
        alert("Error during AJAX call. Please try again");
    }
    }
}

handleServerResponse - 工作的

function handleServerResponse(obj) 
{
    alert(xmlhttp.responseText);
    if (xmlhttp.readyState == 4)
    {
        if(xmlhttp.status == 200) 
    {
            obj.value=xmlhttp.responseText; //Update the HTML Form element 
    }
    else 
    {
        alert("Error during AJAX call. Please try again");
    }
    }
}
4

2 回答 2

3

你的“作品”意外地起作用,它实际上不起作用。

会发生什么:

  1. 发送 xmlhttp 请求(稍后会回复)。
  2. 您立即尝试检查readyState,这还没有4,因为还没有准备好!

在另一种情况下,会发生这种情况:

  1. 发送 xmlhttp 请求(稍后会回复)。
  2. 您通过使用阻止浏览器alert。当警报打开时,AJAX 请求会返回。
  3. 您立即检查readyState,现在它 4

如果你关闭alert 得足够快,它会再次破裂。

处理 AJAX(以及一般的异步)的正确方法是使用事件侦听器。

xmlhttprequest.addEventListener("onreadystatechange", function (event) {
    if (xmlhttprequest.readyState === 4) {
        // handle reply
    }
});
于 2013-03-09T00:10:32.870 回答
0

在这条线上

xmlhttp.onreadystatechange  = handleServerResponse(obj);

您正在调用handleServerResponse而不是设置 on readystate 更改处理程序。您必须为xmlhttp.onreadystatechange您正在做的事情分配一个功能,即分配handleServerResponse(obj). 尝试

xmlhttp.onreadystatechange  = function(){
                                  handleServerResponse(obj);
                              };

第二个成功的原因也是因为警报阻止执行,并且在进行检查之前完成了 ajax 调用。

于 2013-03-09T00:11:20.073 回答