只有在ajax验证成功后才能提交表单


Submit form only after ajax verification success

我试图让一个"添加到购物车"按钮只在ajax调用成功返回时执行实际提交(转到添加到购物店页面),否则显示ajax结果中给出的消息,而不实际执行提交。

这就是我目前拥有的

$("#addtocart").submit(function(event){
    var data = $(this).serialize();
    $.ajax({
        type: "POST",
        url: "/cart/check",
        dataType:"json",
        data: data
    }).done(function(data){ 
        $("#message").html(data.message);              
        if (data.success == true) this.submit();         
    })
    event.preventDefault();         
});

如果我删除event.prventDefault(),无论检查如何,表单都会提交,如果我保留它,它永远不会提交。也许这个.submit()不是正确的解决方案。我在某个地方读到,只有在验证没有成功的情况下,才应该调用preventdefault,但如果我尝试

if (data.success == false) event.preventDefault(); 

无论data.success是真是假,它仍然提交表单

如果有人能找到正确的解决方案,我将不胜感激done回调中的this是jqXhr对象,而不是表单,如果您想将表单绑定为done函数的上下文,请使用`context-config。

$.ajax({
    context: this, //<-- the form
    ...

this不是回调中的表单,因为它通常设置为调用方的上下文,这是jQuery的代码,而不是您的代码。有几种不同的方法可以修复它:

使用$.ajaxcontext属性将回调中的this设置为您想要的任何值——可能是this

$.ajax({
    ...
    context: this
})

使用$("#addtocart")而不是this。但是,如果您改变了对所使用选择器的想法,或者希望对多个不同的表单使用相同的代码,那么它的可扩展性就会降低。

使用event.target(或$(event.target))在事件的目标上运行代码,不管它恰好是什么元素。这意味着,如果您决定仍要使用jQuery XHR对象,您仍然可以通过this访问它,尽管这对您来说可能根本不重要。