Javascript - 根据ajax响应停止表单提交[重复]

Posted

技术标签:

【中文标题】Javascript - 根据ajax响应停止表单提交[重复]【英文标题】:Javascript - Stop form submit depending on ajax response [duplicate] 【发布时间】:2013-06-10 10:32:37 【问题描述】:

我想使用 AJAX 来确定我是否可以接受表单的值(这不是表单验证)。 AJAX result 将确定表单是否提交。

下面,您将看到我在提交表单时执行 AJAX 调用,具体取决于返回的内容(可接受的空白或不可接受的错误消息),我想 return true;return false;$("form").submit

我怀疑我的问题出在 AJAX 的 success: 上。请帮助我将 result 从 AJAX 调用中取出,以便我可以执行 if (result == "") return true; else return false; 之类的操作。

工作:

$("form").submit(function(e) 
    e.preventDefault();
    var form = this;
    var tray = $('select[name=tray_id]').val();
    $.ajax(
        type: "POST",
        url: "modules/reserve-check.php",
        data: tray_id: tray,
        cache: false
    ).done(function(result) 
        if (result == "")
            form.submit();
        else
            alert(result);
    ).fail(function() 
        alert('ERROR');
    );
);

原文:

$("form").submit(function() 
    var tray = $('select[name=tray_id]').val();
    $.ajax(
        type: "POST",
        url: "modules/reserve-check.php",
        data: tray_id: tray,
        cache: false,
        success: function(result) 
                alert(result);
        ,
        error: function(result) 
            alert(result); //This works as expected (blank if acceptable and error msg if not acceptable)
        
    );

    /*
    if (result == "")
        return true; 
    else
        return false; 
    */
    return false; //this is here for debugging, just to stop the form submission
);

【问题讨论】:

为什么不通过 AJAX 调用将整个表单提交给服务器,让服务器决定什么是可接受的。然后你可以让服务器返回一个成功或错误代码,你可以采取相应的行动 只能从同步代码中返回,Ajax 是异步的。阅读上面的帖子并使用回调。 更进一步 Mike W 所说,如果你确实通过 Ajax 进行了提交前的可接受性测试,你真的需要在你提交的 PHP 代码中重复测试,以防用户禁用了 JS或以其他方式设法绕过您的提交处理程序。 【参考方案1】:

由于 ajax 调用是异步的,所以你必须阻止表单提交,然后当返回结果时,你检查它是否符合条件并使用原生提交处理程序提交表单,避免 preventDefault() 中的jQuery 事件处理程序:

$("form").submit(function(e) 
    e.preventDefault();

    var self = this,
        tray = $('select[name=tray_id]').val();

    $.ajax(
        type: "POST",
        url: "modules/reserve-check.php",
        data: tray_id: tray,
        cache: false
    ).done(function(result) 
        if (result == "") self.submit();
    ).fail(function() 
        alert('error');
    );
);

【讨论】:

还有$("form").off('submit')也可以 @claustrofob - 不,不会。这不会导致提交。 @nnnnnn 你是对的。它是一个原生 DOM 对象。 @adeneo..Super..完美答案..谢谢..:) @hex494D49 - 这是因为 jQuery 事件处理程序包含 submit 事件。换句话说,当您执行$("form") 时,您最终会进入$("form").submit(function() ...) 事件处理程序,该事件处理程序又会尝试再次提交表单,最终会进入相同的事件处理程序,这反过来又会再次提交表单,结束在同一个事件处理程序中......等等。当你调用 native form.submit(),它不是 jQuery 函数时,不会触发事件处理程序,而是提交表单。【参考方案2】:

使用e.preventDefault();阻止表单提交,然后使用this.submit()(不是调用jQuery的.submit()触发函数,而是调用原生的<form> .submit()函数)提交表单。

$("form").submit(function(e) 
            e.preventDefault();
            var tray = $('select[name=tray_id]').val();
            var form = this;
            $.ajax(
                type: "POST",
                url: "modules/reserve-check.php",
                data: tray_id: tray,
                cache: false,
                complete : function(result)callback(result, form)
            );       
        );

var callback = function(result, form)
  if(!result)
    form.submit();
;

【讨论】:

这行不通。 (提示:“Ajax”中的“A”代表什么?) 不行,再来一次!使用$(this).submit() 只会再次触发相同的事件处理程序。 现在你有一个范围问题,因为 $.ajax 中的函数调用中的this 不是表单。 我花了这么长时间!我应该去睡觉吗? :D 你差不多完成了。不要放弃!

以上是关于Javascript - 根据ajax响应停止表单提交[重复]的主要内容,如果未能解决你的问题,请参考以下文章

根据ajax响应提交表单

Ajax 表单提交响应

Ajax发布表单和下载文件作为响应

AJAXform表单验证

HTML,如何按回车提交表单

根据ajax响应的结果在下拉菜单中自动选择一个选项[重复]