2013-01-17 18 views
52

Mam formularz, który po przesłaniu, muszę wykonać dodatkowe przetwarzanie przed wysłaniem formularza. Mogę zapobiec domyślnemu zachowaniu się przy składaniu formularzy, a następnie przeprowadzić dodatkowe przetwarzanie (to zasadniczo wywołanie interfejsu API serwisu Mapy Google i dodanie kilku ukrytych pól do formularza), a następnie potrzebuję formularza do przesłania.jQuery - uniemożliwić domyślne, a następnie kontynuować domyślne

Czy istnieje sposób, aby "zapobiec domyślnie", a następnie jakiś punkt "kontynuować domyślnie?"

+2

To dupek, po prostu nie można go znaleźć: - /. Krótko mówiąc, musisz wyzwolić zdarzenie ponownie i nie zapobiegać domyślnej akcji po raz drugi (użyj flagi). –

+0

@FelixKling Czy chodziło Ci o http://stackoverflow.com/questions/7610871/how-to-trigger-an-event-after-using-event-preventdefault? –

Odpowiedz

13

Chciałbym po prostu zrobić ..

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

połączenia preventDefault w pierwszym i używać submit() funkcja później .. jeśli u wystarczy przesłać formularz

+0

nie zawierają logiki wewnątrz obsługi zdarzeń kliknięcia. przekazać innym odpowiedzialność. –

+0

Zgadzam się .. :) .. dzięki za sugestię ... – bipen

+20

To zakłada, że ​​kliknie przycisk. Co się stanie, jeśli użytkownik po prostu kliknie przycisk "Wprowadź" w formularzu? To również prześle formularz. Dlatego nie należy polegać na kliknięciu przycisku przesyłania. – StackOverflowNewbie

2

można użyć e.preventDefault() który zatrzyma bieżącą operację .

niż można zrobić $("#form").submit();

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

Kiedy wiążą zdarzenie .submit() do formularza, i robisz, co chcesz zrobić przed powrotem (true), te rzeczy dzieją się przed faktycznym złożeniem.

Na przykład:

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

Simple example

Innym przykładem na jquery.com: http://api.jquery.com/submit/#entry-examples

+1

czy mówisz, że formularz nie zostanie przesłany, dopóki cały kod przed "return true;" instrukcja jest wykonana? – arvinsim

+1

Tak właśnie działa funkcja [submit()] (http://api.jquery.com/submit/#entry-examples). –

+3

To nie jest dobry przykład, ponieważ jest synchroniczny. A co, jeśli muszę zrobić tylko połączenie asynchroniczne? Tak jest w przypadku "kliknij przycisk Wyślij -> wykonaj asynchronizację i nie" prześlij formularza -> w asynchronicznym wywołaniu zwrotnym wypełnij pola w formularzu -> prześlij formularz z oddzwonienia " –

8

Stosując ten sposób można zrobić nieskończoną pętlę na Twoje JS. zrobić lepszy sposób można użyć następujących

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. 

Mam nadzieję, że to pomaga! Dzięki!

+0

najlepszy sposób, odmiana z funkcją asynchroniczną - https://gist.github.com/BjornMelgaard/8ba0ee9d07c20dd8c8b3550c9df3e9ef – bjornmelgaard

+0

@bjornmelgaard Muszę pamiętać, że asynchronizacja jest [niestandardowa] (https://developer.mozilla.org/ en-US/docs/Web/API/Document/async). –

17

Zastosowanie jQuery.one()

Dołączanie do obsługi zdarzenia dla elementów. Handler jest wykonywany co najwyżej raz na element od rodzaju zdarzenia

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

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

Czyni to, co chcesz i nie musisz się martwić o wielokrotności złożenia.

+0

To najprostsza odpowiedź, dziękuję! – Eckstein

0

„zastrzyk Walidacja bez submit zapętlenie”:

Chcę tylko sprawdzić Odśwież i kilka innych rzeczy przed walidacji HTML5, więc zrobiłem coś takiego (funkcja walidacji zwraca true lub 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

W czysty sposób JavaScript można przesłać formularz po zablokowaniu domyślnego.

Dzieje się tak, ponieważ HTMLFormElement.submit()never calls the onSubmit(). Tak więc polegamy na tym dziwactwie specyfikacji, aby przesłać formularz tak, jakby nie miał on niestandardowego programu obsługi onsubmit.

var submitHandler = (event) => { 
    event.preventDefault() 
    console.log('You should only see this once') 
    document.getElementById('formId').submit() 
} 

Aby uzyskać synchroniczne żądanie, patrz this fiddle.


Oczekiwanie na żądanie asynchronicznym skończyć jest równie proste:

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

Można sprawdzić moje skrzypce na example asynchronicznej życzenie.


A jeśli jesteś w dół z obietnic:

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') 
} 

i oto that request.

Powiązane problemy