2013-01-17 105 views
52

我有一個表單,提交時,我需要做一些額外的處理之前,它應該提交表單。我可以防止默認的表單提交行爲,然後做我的額外處理(它基本上調用Google Maps API並向窗體添加一些隱藏字段) - 然後我需要提交表單。jQuery - 防止默認,然後繼續默認

有沒有辦法「防止默認」,然後稍後再點「繼續默認?」

+2

這是笨蛋,就是找不到它: - /。長話短說,你必須再次觸發事件,而不是第二次阻止默認行爲(使用標誌)。 –

+0

@FelixKling你的意思是http://stackoverflow.com/questions/7610871/how-to-trigger-an-event-after-using-event-preventdefault? –

回答

13

我只想做..

$('#submiteButtonID').click(function(e){ 
    e.preventDefault(); 
    //do ur stuff. 
    $('#formId').submit(); 
}); 

呼叫preventDefault在第一和使用submit()功能後..如果u只需要提交表單

+0

不涉及您的點擊事件處理程序中的邏輯。委託給他人負責。 –

+0

我同意.. :) ..感謝您的建議... – bipen

+20

這假設肯定會點擊一個按鈕。如果用戶剛剛從表單中點擊「輸入」按鈕,該怎麼辦?這也將提交表格。所以,依靠點擊提交按鈕可能不是一個好主意。 – StackOverflowNewbie

2

您可以使用e.preventDefault()將停止當前操作。

比你可以做$("#form").submit();

$('#form').submit(function (e) 
{ 
    return !!e.submit; 
}); 
if(blabla...) 
{... 
} 
else 
{ 
    $('#form').submit(
    { 
     submit: true 
    }); 
} 
36

當您綁定的.submit()事件的形式,並在返回(真)之前,做你想做的事情,這些事情發生之前,實際提交。

例如:

$('form').submit(function(){ 
    alert('I do something before the actual submission'); 
    return true; 
}); 

Simple example

又如上jquery.com:http://api.jquery.com/submit/#entry-examples

+1

你是說表單將不會提交,直到所有代碼在「返回true」之前;語句被執行? – arvinsim

+1

是的,這正是[submit()](http://api.jquery.com/submit/#entry-examples)函數的作用。 –

+3

這不是一個很好的例子,因爲它是同步的。如果我需要做的是異步調用?所以這種情況是「點擊提交 - >做異步的東西,不提交表單 - >在異步回調填充表單中的一些字段 - >從回調提交表單」 –

8

使用這種方式你會做一個死循環對你的JS。 做你可以使用更好的方法如下

var on_submit_function = function(evt){ 
    evt.preventDefault(); //The form wouln't be submitted Yet. 
    (...yourcode...) 

    $(this).off('submit', on_submit_function); //It will remove this handle and will submit the form again if it's all ok. 
    $(this).submit(); 
} 

$('form').on('submit', on_submit_function); //Registering on submit. 

我希望它能幫助! 謝謝!

+0

實際上最好的方法,與異步函數的變化 - https://gist.github.com/BjornMelgaard/8ba0ee9d07c20dd8c8b3550c9df3e9ef – bjornmelgaard

+0

@bjornmelgaard我必須記住,異步是[非標準](https://developer.mozilla.org/ EN-US /文檔/網絡/ API /文檔/異步)。 –

17

使用jQuery.one()

附加的處理程序爲元素的事件。該處理程序最多各事件類型

$('form').one('submit', function(e) { 
    e.preventDefault(); 
    // do your things ... 

    // and when you done: 
    $(this).submit(); 
}); 

它做你想要什麼,你不必擔心多次提交執行每一次元素。

+0

這是最簡單的答案,謝謝! – Eckstein

0

「驗證注沒有提交循環」:

我只是想檢查的reCAPTCHA和HTML5驗證之前一些其他的東西,所以我做了類似的東西(驗證函數返回true或false):

$(document).ready(function(){ 
    var application_form = $('form#application-form'); 

    application_form.on('submit',function(e){ 

     if(application_form_extra_validation()===true){ 
      return true; 
     } 

     e.preventDefault(); 

    }); 
}); 
0

以純Javascript方式,您可以在防止默認情況下提交表單。

這是因爲HTMLFormElement.submit()never callsonSubmit()。所以我們依靠這個規範怪異的方式來提交表單,就好像它沒有自定義的onsubmit處理器一樣。對於同步請求,請參見this fiddle


等待異步請求的完成起來也很簡單:

var submitHandler = (event) => { 
    event.preventDefault() 
    console.log('before') 
    setTimeout(function() { 
    console.log('done') 
    document.getElementById('formId').submit() 
    }, 1400); 
    console.log('after') 
} 

您可以檢查出我的小提琴異步請求的example


如果你是來與承諾:

var submitHandler = (event) => { 
    event.preventDefault() 
    console.log('Before') 
    new Promise((res, rej) => { 
     setTimeout(function() { 
     console.log('done') 
     res() 
     }, 1400); 
    }).then(() => { 
     document.getElementById('bob').submit() 
    }) 
    console.log('After') 
} 

而這裏的that request