小编典典

如何使JQuery-AJAX请求同步

ajax

如何使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

这就是为什么总是提交表单并且独立于是否同步发送请求的原因。

因此,我1在成功后将变量设置为成功函数内部。并从成功函数中检查了它的值,如果它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;
    }
}

阅读 498

收藏
2020-07-26

共1个答案

小编典典

jQuery.ajax()

async 布尔
值默认值:true
默认情况下,所有请求都是异步发送的(即默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。

因此,在您的请求中,您必须async: false代替async: "false"

更新

的返回值ajaxSubmit不是 的返回值success: function(){...}ajaxSubmit完全不返回任何值,该值等于undefined,后者的结果为true。

也是这个道理,为什么表单总是提交并独立发送请求同步与否。

如果只想提交表单,则响应为"Successful",则必须false从@
返回ajaxSubmit,然后success按照@halilb的建议在函数中提交表单。

遵循这些思路的东西应该起作用

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;
}
2020-07-26