Return 语句在 ajax 响应之前执行

Return statement executes before ajax response

我正在对提交按钮单击事件进行 ajax 调用,以检查服务器端的字段验证。 当我收到验证失败时,ajax 响应会给出正确的错误消息 returns false,并停止表单提交给操作 url。但是当我收到 'success' 的响应时,表单仍然没有提交到操作 url 脚本。

return 语句在 ajax 响应之前执行时是否属于这种情况?

还有为什么没有提交表单?

代码如下:

<input type="submit" onclick="return validate();" name="submit" value="Proceed" />

<script type="text/javascript">
    var flag=false;
    function validate(){

        $.ajax({
            type:"POST",
            url:"../chk.php",
            data:datastring,
            cache: false,
            success: function (result) {


                if(result.toString() == "success" ){

                    flag=true;

                }

                else{
                    $('#error').css('display', 'block');
                    $('#error').css('color','red');
                    $('#error').text(result.toString());
                    flag=false;
                }
            }

        });


        return flag;
    }
</script>

Ajax 是异步的,所以你应该只将一个函数作为参数传递给函数,然后在 ajax 调用成功时执行它。

function my_callback() {
    alert('done');
}

function validate(cb) {
    $.ajax({
        /* ... */
        success: function() {
            cb();
        }
    });
}

您传递给 validate 的函数将在 success 函数调用时执行。

一种方式是

使用async : false

将 async 设置为 false 意味着您正在调用的语句必须在调用函数中的下一个语句之前完成。

$.ajax({
            type:"POST",
            url:"../chk.php",
            data:datastring,
            cache: false,
            async : false,
            success: function (result) {

还有为什么你 return 在 ajax 函数外输入值,return 在 ajax 内的值 如果你不使用 async : false

 $.ajax({
            type:"POST",
            url:"../chk.php",
            data:datastring,
            cache: false,
            success: function (result) {


                if(result.toString() == "success" ){

                    flag=true;

                }

                else{
                    $('#error').css('display', 'block');
                    $('#error').css('color','red');
                    $('#error').text(result.toString());
                    flag=false;
                }
            }

             return flag;

        });