2012-07-13 180 views
3

我有一個表單,提交時,通過通常的e.preventDefault()併發送一個ajax請求。但是,如果這個Ajax請求返回一定的條件,我希望表單能夠正常提交。我如何實現這一目標?jQuery覆蓋event.preventDefault()

// 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 2012-07-13 14:27:49

+3

@jeschafe這可能會導致一個無限循環... – Chandu 2012-07-13 14:32:12

回答

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() method或形式:

$(".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序列化)發送到服務器,並且當響應不包含錯誤時,再次發送它?服務器會處理它兩次(並根據您的表單行爲兩次)。另外,用戶沒有收到他的輸入已經被處理的消息 - 他點擊「提交」,並且它總是需要一些時間直到它被可見地提交(他甚至可以改變一些輸入)。

+0

如果你觸發jQuery處理程序,你將有一個無限循環。 – 2012-07-13 14:32:35

+0

哎呀,固定。起初,我只想直接使用它,但後來我緩存了$形式的jQuery實例,並沒有認識到這會改變行爲:-) – Bergi 2012-07-13 14:40:25

+0

如果可以,我會刪除DV,但它不是我的。雖然我不認爲這個要求很奇怪。它只是進行必要的服務器端驗證,並在出現錯誤時拒絕提交。 – 2012-07-13 14:42:31