同步ajax后执行javascript代码

时间:2016-01-07 09:22:27

标签: javascript php ajax

我在使用JavaScript点击按钮时调用ajax函数。 php脚本评估参数并回显1表示成功或0表示失败。要强制执行其他JavaScript代码,我使用的是同步方法(false)。然而,在成功执行php代码之后,进一步的JavaScript行,即警报不会运行。如何使这成为可能? 注意:我不确定此问题是否曾被提出过。

var parameters = "user="+usr+"&id="+id;
ajaxRequest.open("POST", 'chk.php', false);
ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
ajaxRequest.send(parameters);
ajaxRequest.onreadystatechange = function(){
    if(ajaxRequest.readyState == 4){
        if (ajaxRequest.responseText == 1) {
            alert('Success');
        } else {
            alert('Failure');
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  

要强制执行其他JavaScript代码,我使用的是同步方法(false)。

在引用的代码中没有必要这样做。

  

然而,在成功执行php代码之后,其他JavaScript行不会运行。

那是因为你正在使用同步请求,并在错误的地方挂钩onreadystatechange。如果你把它变成异步,它就会起作用(但仍然应该改变)。

使XHR请求同步意味着send在工作完成之前不会返回。您不会将onreadystatechange处理程序连接到之后 send,因此在请求完成时它不会被连接,所以您的代码在处理程序中不运行。

如果您想让它保持同步,请在 onreadystatechange之前将代码设置为send移至。 (即使你把它变成异步也应该这样做。)

如果要在处理程序中编写代码以在请求完成时运行,则无需将其作为同步请求,并且有充分的理由

推荐的更改:

var parameters = "user="+usr+"&id="+id;
ajaxRequest.open("POST", 'chk.php', true);    // <== use async
ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
ajaxRequest.onreadystatechange = function(){  // <== Moved up
    if(ajaxRequest.readyState == 4){
        if (ajaxRequest.responseText == 1) {
            alert('Success');
        } else {
            alert('Failure');
        }
    }
};
ajaxRequest.send(parameters);

但如果您确实需要同步请求,请将false保留在open上。