Formularumleitung verhindern ODER beim Senden aktualisieren?

96

Ich habe eine Reihe von Seiten durchsucht, kann aber mein Problem nicht finden, daher musste ich einen Beitrag verfassen.

Ich habe ein Formular mit einer Schaltfläche zum Senden, und wenn es gesendet wird, soll es NICHT aktualisiert oder umgeleitet werden. Ich möchte nur, dass jQuery eine Funktion ausführt.

Hier ist das Formular:

<form id="contactForm">
    <fieldset>
        <label for="Name">Name</label>
        <input id="contactName" type="text" />
    </fieldset>

    <fieldset>
        <label for="Email">Email</label>
        <input id="contactEmail" type="text" />
    </fieldset>

    <fieldset class="noHeight">
        <textarea id="contactMessage" cols="20"></textarea>
        <input id="contactSend" class="submit" type="submit" onclick="sendContactForm()" />
    </fieldset>
</form>        
<small id="messageSent">Your message has been sent.</small>

Und hier ist die jQuery:

function sendContactForm(){
    $("#messageSent").slideDown("slow");
    setTimeout('$("#messageSent").slideUp();$("#contactForm").slideUp("slow")', 2000);
}

Ich habe es mit und ohne Aktionselement im Formular versucht, weiß aber nicht, was ich falsch mache. Was mich mehr geärgert hat, ist, dass ich ein Beispiel habe, das es perfekt macht: Beispielseite

Wenn Sie mein Problem live sehen möchten, gehen Sie zu Stormink.net (meine Website) und sehen Sie in der Seitenleiste nach, in der "Senden Sie mir und E-Mail" und "RSS-Abonnement" steht. Beides sind Formen, an denen ich versuche, dies zum Laufen zu bringen.

Ian Storm Taylor
quelle

Antworten:

178

Behandeln Sie einfach die Formularübermittlung für das Übermittlungsereignis und geben Sie false zurück:

$('#contactForm').submit(function () {
 sendContactForm();
 return false;
});

Sie benötigen das Ereignis onclick auf der Schaltfläche "Senden" nicht mehr:

<input class="submit" type="submit" value="Send" />
CMS
quelle
11
Lief wie am Schnürchen! Und schnell wie alles! Ich liebe diese Seite! Ich danke dir sehr.
Ian Storm Taylor
3
Ich erinnere mich, dass der Moment, in dem ich erfuhr, dass man von einem Submit zum Nicht-Submit falsch zurückgeben kann, auch der Moment war, in dem ich anfing, das Javascript / DOM-System wirklich zu mögen.
Imagist
Tolle. Wo finde ich Spezifikationsdokumente, die erklären, dass falsedie Übermittlung verhindert wird?
David
7
Sie sollten wirklich e.preventDefault () verwenden, anstatt nur false zurückzugeben.
Juan
3
@ RogerFilmyer falsch. wenn Sie "return false" verwenden; Sie stoppen auch die Weitergabe, was zu UX-Problemen führt. Zum Beispiel, wenn Sie erwarten, dass ein "Klick" in die Luft sprudelt oder so etwas.
Juan
19

Hier:

function submitClick(e)
{
     e.preventDefault();
     $("#messageSent").slideDown("slow");
     setTimeout('$("#messageSent").slideUp();
     $("#contactForm").slideUp("slow")', 2000);
}

$(document).ready(function() {
    $('#contactSend').click(submitClick);
});

Anstatt das Ereignis onClick zu verwenden, binden Sie mit jQuery einen 'Click'-Ereignishandler an die Schaltfläche "Senden" (oder eine beliebige Schaltfläche), wodurch submitClick als Rückruf verwendet wird. Wir übergeben das Ereignis an den Rückruf, um PreventDefault aufzurufen. Dadurch wird verhindert, dass der Klick das Formular sendet .

karim79
quelle
$ ('# contactSend'). click (submitClick (e)); Es sagt mir, dass 'e' nicht definiert ist ..: /
David Da Silva Contín
3
Sollte sein $('#contactSend').click(function(e) { submitClick(e) });oder$('#contactSend').click(submitClick);
Aaron
14

Legen Sie im Eröffnungs-Tag Ihres Formulars ein Aktionsattribut wie folgt fest:

<form id="contactForm" action="#">
Brian Loughnane
quelle
2
+1 für einfache Lösung. Leider wird die Seite immer noch aktualisiert, wenn der Benutzer zum ersten Mal die Eingabetaste drückt. Eine schlechte Lösung wäre, myForm.submit();so schnell wie möglich anzurufen , aber dann laden Sie die Seite zweimal.
Radsportler
Es wird beim ersten Mal nicht aktualisiert.
Nearoo
Diese Antwort muss abgelehnt werden, da sie die ursprüngliche Frage NICHT löst und die Situation verschlimmert, indem die URL nach dem erneuten Laden der Seite tatsächlich geändert wird. Sie müssen entweder e.preventDefault()oder return falsein der Onsubmit-Funktion. stackoverflow.com/questions/19454310/…
Jeff
10

Es sieht so aus, als ob dir ein fehlt return false.

Jesse Kochis
quelle
6

Wenn Sie möchten, dass die Standardbrowserfehler angezeigt werden , z. B. die durch HTML-Attribute ausgelösten (die vor einer JS-Behandlung mit Clientcode angezeigt werden):

<input name="o" required="required" aria-required="true" type="text">

Sie sollten das submitEreignis anstelle des clickEreignisses verwenden. In diesem Fall wird automatisch ein Popup mit der Aufforderung " Bitte füllen Sie dieses Feld aus " angezeigt . Auch mit preventDefault:

$('form').on('submit', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will show up a "Please fill out this field" pop-up before my_form_treatment

Wie bereits erwähnt , return falsewürde die Weitergabe gestoppt (dh wenn mehr Handler an die Formularübermittlung angehängt sind, werden diese nicht ausgeführt). In diesem Fall wird die vom Browser ausgelöste Aktion jedoch immer zuerst ausgeführt. Auch mit einemreturn false am Ende.

Also , wenn Sie dieser Standard Pop-ups loswerden wollen , verwenden Sie das clickEreignis auf die Schaltfläche einreichen:

$('form input[type=submit]').on('click', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will NOT show any popups related to HTML attributes
CPHPython
quelle
3

Eine alternative Lösung wäre, kein Formular-Tag zu verwenden und das Klickereignis auf der Schaltfläche "Senden" über jquery zu behandeln. Auf diese Weise wird keine Seitenaktualisierung durchgeführt, aber gleichzeitig gibt es einen Nachteil, dass die Eingabetaste für die Übermittlung nicht funktioniert und auch auf Mobiltelefonen keine Startschaltfläche angezeigt wird (ein Stil bei einigen Mobiltelefonen). Halten Sie sich also an die Verwendung des Formular-Tags und verwenden Sie die akzeptierte Antwort.

Shishir Arora
quelle