我遇到了问题。下面的函数100%工作,但调用函数的if
语句在函数返回结果之前解析!
警告“test2”将显示在“结果:”+数据框的警报之前。是什么原因?
(问题在于,无论什么原因,它总是会解析为假,因为即使有什么东西要归还,也不会返回任何内容!)
function checkUsername ( username ) {
$.post("ajax_messages.php",{
func: "checkUsername",
username: username
}, function(data){
alert("result: "+data);
return data;
});
}
$('.send').click( function () {
if ( checkUsername($receiverBox.val()) == "true" ) {
alert("test");
return false;
} else {
alert("test2");
return false;
}
});
编辑:
感谢您的快速回复。我尝试了以下方法:
$.ajaxSetup({
async:false
});
Edit2:但这也没有按预期行事。作为一套正常的功能,我将被期望采取行动。所以我将尝试更多下面的方法
编辑3:成功!太棒了。有点笨拙,但比我能找到的任何其他方法更顺畅。我希望这有帮助
var checkUsernameResult = false;
function checkErrorCheckingIsComplete( ) {
if ( checkUsernameResult != false ) {
alert( checkUsernameResult );
}
}
function checkUsername ( username ) {
$.post("ajax_messages.php",{
func: "checkUsername",
username: username
}, function(data){
alert("result: "+data);
checkUsernameResult = data; // each check has one of these
checkErrorCheckingIsComplete(); // all checks have this as the end
});
}
$('.send', $message_box).click( function () {
checkUsername( $receiverBox.val() );
//more checks here
return false;
});
答案 0 :(得分:2)
由于AJAX调用是asynchronous
,因此会发生这种情况。使用.post
的回调函数并将if语句放入其中。
您可以做的另一件事是使用同步调用。但这会阻止浏览器在此期间执行任何其他操作。
答案 1 :(得分:2)
我认为您可能必须创建另一个执行提交的按钮,因为您永远不会使用Ajax的异步函数进行响应。
使用“实际发送”类向HTML页面添加另一个按钮,然后尝试此...
var asynchResult = "false";
function checkUsername ( username ) {
$.post("ajax_messages.php",{
func: "checkUsername",
username: username
}, function(data){
alert("result: "+data);
asynchResult = data;
$('.actual-send').trigger('click');
});
}
$('.send').click( function () {
checkUsername($receiverBox.val())
return false;
}
$('.actual-send').click( function () {
if(asynchResult == "true") {
alert("test");
return true;
} else {
alert("test2");
return false;
}
}
答案 2 :(得分:1)
我几个月没有使用过jQuery,但我很确定你可以设置一个标志来强制Ajax调用作为同步调用发生。
答案 3 :(得分:1)
正如其他答案所说,post()方法是异步的,因此它独立于其余代码执行。
如果有必要,您可以强制jquery使用async:false
同步调用服务器,我认为您必须使用jQuery.ajax()函数而不是.post()简写来执行此操作。
它通常可以更好地异步工作,因为在同步模式下,它会在等待来自服务器的响应时冻结网页 - 这对访问者来说不是很棒的体验。更好的想法是将其保持在异步模式并在success()回调中处理服务器响应。
答案 4 :(得分:0)
您可以使用以下内容:
$.ajax({ type: 'POST', url: 'ajax_messages.php', data: data, success: function(html){ alert(html); } dataType: dataType });
所以,在POST成功执行函数,它会抓取你的ajax_messages.php回显和警告的任何内容
答案 5 :(得分:0)
put asynchronous:false