我在使用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');
}
}
}
答案 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
上。