如何使Ajax请求同步?
我有一个需要提交的表格。但是只有在用户输入正确的密码时才需要提交。
这是表单代码:
<form name="form" action="insert.php" method="post" onSubmit="return ajaxSubmit(this);" >
用于发送和检查密码的jQuery代码是这样的:
var ajaxSubmit = function(formE1) { var password = $.trim($('#employee_password').val()); $.ajax({ type: "POST", async: "false", url: "checkpass.php", data: "password="+password, success: function(html) { var arr=$.parseJSON(html); if(arr == "Successful") { return true; } else { return false; } } }); }
但是,无论ajax请求返回的值如何,该表单始终提交。我检查了其他所有内容。输入正确的密码后,arr的值将显示为“成功”,反之亦然。
如何使此请求同步?据我可以调试,请求是异步的,因此在请求完成之前先提交表单。
checkpass.php的代码
<?php require("includes/apptop.php"); require("classes/class_employee.php"); require("classes/class_employee_attendance.php"); $employee_password=$_POST['password']; $m=new employee(); $m->setbyid_employee(1); $arr=$m->editdisplay_employee(); if($arr['employee_password'] == $employee_password) { $res="Successful"; } else { $res="Password not match"; } echo $res; ?>
更新:已找到解决方案。
正如Olaf Dietshche指出的那样:的返回值ajaxSubmit不是的返回值success: function(){...}。ajaxSubmit完全不返回任何值,该值等于undefined,其结果为true。
ajaxSubmit
success: function(){...}
undefined
true
这就是为什么总是提交表单并且独立于是否同步发送请求的原因。
因此,我1在成功后将变量设置为成功函数内部。并从成功函数中检查了它的值,如果它1不在成功函数中,那么我写了return true ... else return false。那行得通。
1
return true ... else return false
更新的工作代码:
var ajaxsubmit=function(forme1) { var password = $.trim($('#employee_password').val()); var test="0"; $.ajax({ type: "POST", url: "checkpass.php", async: false, data: "password="+password, success: function(html) { if(html == "Successful") { test="1"; } else { alert("Password incorrect. Please enter correct password."); test="0"; } } }); if(test=="1") { return true; } else if(test=="0") { return false; } }
从jQuery.ajax()
async 布尔 值默认值:true 默认情况下,所有请求都是异步发送的(即默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。
因此,在您的请求中,您必须async: false代替async: "false"。
async: false
async: "false"
更新 :
的返回值ajaxSubmit是 不是 的返回值success: function(){...}。ajaxSubmit完全不返回任何值,该值等于undefined,后者的结果为true。
而 这 也是这个道理,为什么表单总是提交并独立发送请求同步与否。
如果只想提交表单,则响应为"Successful",则必须false从@ 返回ajaxSubmit,然后success按照@halilb的建议在函数中提交表单。
"Successful"
false
success
遵循这些思路的东西应该起作用
function ajaxSubmit() { var password = $.trim($('#employee_password').val()); $.ajax({ type: "POST", url: "checkpass.php", data: "password="+password, success: function(response) { if(response == "Successful") { $('form').removeAttr('onsubmit'); // prevent endless loop $('form').submit(); } } }); return false; }