我试图让一个"添加到购物车"按钮只在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的代码,而不是您的代码。有几种不同的方法可以修复它:
使用$.ajax
的context
属性将回调中的this
设置为您想要的任何值——可能是this
:
$.ajax({
...
context: this
})
使用$("#addtocart")
而不是this
。但是,如果您改变了对所使用选择器的想法,或者希望对多个不同的表单使用相同的代码,那么它的可扩展性就会降低。
使用event.target
(或$(event.target)
)在事件的目标上运行代码,不管它恰好是什么元素。这意味着,如果您决定仍要使用jQuery XHR对象,您仍然可以通过this
访问它,尽管这对您来说可能根本不重要。