2013-01-17 13 views
52

Ich habe ein Formular, das, wenn ich es übergebe, muss ich einige zusätzliche Verarbeitung, bevor es das Formular senden sollte. Ich kann das Standardverhalten bei der Übermittlung von Formularen verhindern und mache dann meine zusätzliche Verarbeitung (es ruft im Grunde die Google Maps-API auf und fügt dem Formular einige versteckte Felder hinzu) - und dann muss das Formular übermittelt werden.jQuery - Standard verhindern, dann Standard fortsetzen

Gibt es eine Möglichkeit, "Standard zu verhindern", dann einen Punkt später "Standard fortsetzen?"

+2

Das ist dupe, kann es einfach nicht finden: - /. Kurz gesagt, Sie müssen das Ereignis erneut auslösen und die Standardaktion nicht ein zweites Mal verhindern (verwenden Sie eine Markierung). –

+0

@FelixKling Meinten Sie http://stackoverflow.com/questions/7610871/how-to-trigger-an-event-after-using-event-preventdefault? –

Antwort

13

würde ich nur tun ..

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

Anruf preventDefault auf den ersten und submit() Funktion später verwenden .. wenn u müssen nur die

Formular
+0

enthalten keine Logik in Ihrem Click-Ereignishandler. delegiere es an andere Verantwortliche. –

+0

ich stimme zu .. :) .. danke für den Vorschlag ... – bipen

+20

Dies setzt voraus, dass der sicher auf eine Schaltfläche klicken wird. Was passiert, wenn der Benutzer nur die "Enter" -Schaltfläche im Formular drückt? Das wird auch das Formular einreichen. Es ist also wahrscheinlich keine gute Idee, sich darauf zu verlassen, dass der Submit-Button angeklickt wird. – StackOverflowNewbie

2

Sie e.preventDefault() verwenden können, die den aktuellen Vorgang stoppen .

als Sie $("#form").submit();

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

tun können, wenn Sie die .submit() Ereignis an die Form binden, und Sie tun, um die Dinge, die Sie vor der Rückkehr (true) tun wollen, passieren diese Dinge vor der eigentlichen Unterwerfung.

Zum Beispiel:

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

Simple example

Ein weiteres Beispiel auf jquery.com: http://api.jquery.com/submit/#entry-examples

+1

Sagen Sie, dass das Formular erst übergeben wird, wenn der gesamte Code vor dem "return true;" Anweisung wird ausgeführt? – arvinsim

+1

Ja, das ist genau das, was die Funktion [submit()] (http://api.jquery.com/submit/#entry-examples) tut. –

+3

Es ist kein gutes Beispiel, becayse es ist synchrony. Was, wenn das Zeug, das ich tun muss, ein Async-Anruf ist? Also der Fall ist "Klicken Sie auf Senden -> tun async Zeug und nicht 'sende das Formular -> in async Callback füllen Sie einige Felder im Formular -> senden Sie das Formular aus dem Rückruf" –

8

auf diese Weise verwenden Sie eine Endlosschleife auf Ihre JS tun. eine bessere Art und Weise zu tun Sie das folgende

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. 

verwenden Ich hoffe, es hilft! Danke!

+0

der beste Weg tatsächlich, Variation mit asynchronen Funktion - https://gist.github.com/BjornMelgaard/8ba0ee9d07c20dd8c8b3550c9df3e9ef – bjornmelgaard

+0

@bjornmelgaard Ich muss daran denken, dass der Async ist [nicht Standard] (https://developer.mozilla.org/ de-DE/docs/Web/API/Dokument/async). –

17

Verwenden jQuery.one()

Attach einen Handler auf ein Ereignis für die Elemente. Der Handler wird höchstens einmal ausgeführt pro Element pro Ereignistyp

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

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

Es tut, was Sie wollen, und Sie brauchen nicht einreichen über mehr zu kümmern.

+0

Das ist die einfachste Antwort, danke! – Eckstein

0

„Validation Injektion ohne einreichen Looping“:

Ich will nur reCaptcha und einige andere Sachen vor HTML5 Validierung überprüfen, also tat ich so etwas wie das (die Validierung Funktion gibt wahr oder falsch):

$(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

In einer reinen Javascript-Methode können Sie das Formular nach dem Verhindern von Standard übermitteln.

Dies ist weil HTMLFormElement.submit()never calls die onSubmit(). Wir verlassen uns also auf diese Spezifikation, um das Formular so zu übermitteln, als ob es hier keinen benutzerdefinierten Handler für das Übergeben von Nachrichten gibt.

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

Siehe this fiddle für eine synchrone Anfrage.


für eine Asynchron-Anfrage ist genauso einfach zu beenden Warten:

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

Sie können meine Geige Besuche für ein example eine asynchrone Anfrage.


Und wenn Sie unten mit dem Versprechen:

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

Und hier ist that request.

Verwandte Themen