jQuery 覆盖 event.preventDefault()

3

我有一个表单,当提交时,会经过通常的e.preventDefault()并发送一个ajax请求。然而,如果这个ajax请求返回某个特定条件,我希望表单能够正常提交。我该如何实现这一点?

// Submit handler
$(".reserveer_form").submit(function(event){
  event.preventDefault();

  $.ajax({
    url: $(this).attr("action"),
    data: $(this).serialize(),
    success: function(data) {
      if($(".messagered",data).length > 0){
        var errors = $(".messagered",data);
        $(".gegevens").before(errors);
      } else {
          // SUBMIT THE FORM!
      } 
      
    }
  });

})

1
$(".reserveer_form").submit()? - jeschafe
3
@jeschafe 这可能会导致无限循环... - Chandu
3个回答

6

调用表单上的本地submit方法,以便不触发jQuery处理程序。

$.ajax({
    context: this, // <-- set the context.
    url: $(this).attr("action"),
    data: $(this).serialize(),
    success: function (data) {
        if ($(".messagered", data).length > 0) {
            var errors = $(".messagered", data);
            $(".gegevens").before(errors);
        } else {
            this.submit(); // <-- submit the form
        }
    }
});

1

由于您的评论说您更改了一个表单变量,因此您可以通过检查相同的表单变量来启动您的submit处理程序。如果它被更改了,只需return true。如果没有更改,则继续使用当前处理程序。


-1

您可以使用submit()方法或表单:

$(".reserveer_form").submit(function(event){
  event.preventDefault();
  var form = this,
      $form = $(form);

  $.ajax({
    url: $form.attr("action"),
    data: $form.serialize(),
    success: function(data) {
      var errors = $(".messagered", data);
      if (errors.length > 0){
        $(".gegevens").before(errors);
      } else {
        form.submit();
      }
    }
  });
})

然而,这似乎是一个奇怪的ajax请求。首先,您将表单(通过ajax序列化)发送到服务器,当响应不包含错误时,您再次发送它?服务器会处理两次(并根据您的表单执行两次)。此外,用户没有收到输入已经被处理的消息 - 他点击“提交”,并且总是需要一些时间才能明显地提交(在这段时间内,他甚至可以更改某些输入)。


如果触发jQuery处理程序,你将会进入一个无限循环。 - user1106925
糟糕,已修复。起初我只想直接使用它,但后来我在$form中缓存了jQuery实例,没有意识到这会改变行为 :-) - Bergi
如果可以的话,我会删除 DV,但它不是我的。虽然我不认为这个请求很奇怪。只是在进行必要的服务器端验证,并在出现错误时拒绝提交。 - user1106925
只是它有效地提交表单,甚至到实际的URL。与非AJAX提交没有太大区别,但如果第一个“验证”请求成功,将会执行第二次请求,只是丢弃了(有价值的)结果。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接