Standard auf Formular verhindern jQuery senden

137

Was ist daran falsch?

HTML:

<form action="http://localhost:8888/bevbros/index.php/test" method="post" accept-charset="utf-8" id="cpa-form" class="forms">        
      <input type="text" name="zip" value="Zip code" id="Zip" class="required valid">      
      <input type="submit" name="Next" value="Submit" class="forms" id="1">
  </form>

jQuery:

$("#cpa-form").submit(function(e){
    e.preventDefault();
  });
djreed
quelle
12
Funktioniert hier gut . Können Sie weitere Informationen in Ihrer Frage veröffentlichen? Wenn Sie alert()im Submit-Handler sind, wird es aufgerufen? Wenn nicht, liegt möglicherweise ein Fehler in Ihrem Skript vor, der verhindert, dass der Ereignishandler korrekt verkabelt wird. Irgendwas in der Fehlerkonsole?
Stadt
3
Dieser Link ist intern und für uns nutzlos.
Steve Robbins
Möglicherweise wurde eine ältere Version zwischengespeichert. Scheint jetzt zu arbeiten.
Djreed
1
mögliches Duplikat von event.preventDefault () vs. return false
Liam
2
! Stellen Sie sicher, dass der Javascript-Code ausgeführt wird, nachdem DOM bereit ist.
Towry

Antworten:

173

Versuche dies:

$("#cpa-form").submit(function(e){
    return false;
});
Jordan Brown
quelle
12
Es funktioniert, aber warum funktioniert die bevorzugte Methode zur Verhinderung von Default nicht?
MikeJ
26
Siehe diese Frage für eine bessere Erklärung: stackoverflow.com/questions/1357118/…
Jordan Brown
8
Das ist die falsche Antwort. e.preventDefault()funktioniert gut mit einer Formularübermittlung, das Problem lag an anderer Stelle im OP-Code. Die Verwendung return false kann zu unbeabsichtigten Konsequenzen führen.
Chuck Le Butt
58

Verwenden Sie die neue Ereignissyntax "Ein".

$(document).ready(function() {
  $('form').on('submit', function(e){
    // validation code here
    if(!valid) {
      e.preventDefault();
    }
  });
});

Zitieren: https://api.jquery.com/on/

scarver2
quelle
2
Hallo. Das funktioniert bei mir nicht. (Ja, ich habe meinen Code eingegeben. $(document).ready()) Wie mache ich das?
Gui Imamura
1
@GuiImamura Benötigen Sie weitere Informationen. Haben Sie die gültige Variable auf trueoder gesetzt false? Können Sie Ihren Code in jsfiddle.net neu erstellen und den Link senden? Fügen Sie ein hinzu alert(), um zu bestätigen, dass die Funktion ausgelöst wird. Einige Leute haben berichtet, dass das Hinzufügen e.stopPropagation();nach dem e.preventDefault();Anhalten andere verkettete Ereignisse vom Feuern abhält.
Scarver2
Hallo, ich verwende $('#myFormID').validationEngine('validate')von jQuery validationEngine als Variable valid, um zu überprüfen, ob die Eingabe eine gültige E-Mail-Adresse ist. Trotzdem möchte ich, dass das Standardverhalten so oder so verhindert wird. muss preventDefaultsich innerhalb des if-Blocks befinden, nicht davor?
Gui Imamura
@GuiImamura Freut mich zu hören, dass du es zum Laufen gebracht hast. Das preventDefaultbefindet sich im nicht gültigen Block, um die Übermittlung des Formulars zu stoppen. Verwenden Sie mit anderen Worten, falls gültig , das Standardverhalten des Formulars.
Scarver2
13

Ich glaube, dass die obigen Antworten alle richtig sind, aber das zeigt nicht, warum die submitMethode nicht funktioniert.

Nun, die submitMethode funktioniert nicht, wenn jQuery das formElement nicht abrufen kann und jQuery keinen Fehler macht. Wenn Ihr Skript im Kopf des Dokuments platziert ist, stellen Sie sicher , dass der Code läuft nach DOMist bereit . Also, $(document).ready(function () { // your code here // });wird das Problem lösen.

Am besten platzieren Sie Ihr Skript immer am Ende des Dokuments.

Schlepptau
quelle
11

Dies ist eine alte Frage, aber die hier akzeptierte Antwort geht dem Problem nicht wirklich auf den Grund.

Sie können diese beiden Möglichkeiten lösen. Zuerst mit jQuery:

$(document).ready( function() { // Wait until document is fully parsed
  $("#cpa-form").on('submit', function(e){

     e.preventDefault();

  });
}

Oder ohne jQuery:

// Gets a reference to the form element
var form = document.getElementById('cpa-form');

// Adds a listener for the "submit" event.
form.addEventListener('submit', function(e) {

  e.preventDefault();

});

Sie müssen nicht verwenden return false, um dieses Problem zu lösen.

Chuck Le Butt
quelle
Ich habe den nativen js Event Listener anstelle des jquery Event Listeners ersetzt und es funktioniert. Danke für die Idee.
Orhan Gazi
6
$('#cpa-form input[name="Next"]').on('click', function(e){
    e.preventDefault();
});
Crisalin Petrovschi
quelle
Dies funktioniert perfekt für mich auf einer Seite, auf der ich ein clientseitiges Formular in einem serverseitigen Formular habe.
Liknes
3
$(document).ready(function(){
    $("#form_id").submit(function(){
        return condition;
    });
});
Shraddha Dharmamer
quelle
2

Ihr Code ist in Ordnung, Sie müssen ihn nur in die Bereitschaftsfunktion einfügen.

$(document).ready( function() {
  $("#cpa-form").submit(function(e){
     e.preventDefault();
  });
}
Jai Kathuria
quelle
Dieser Rat wird bereits durch andere Antworten gegeben. Bitte entfernen Sie diese Antwort, um das Aufblähen der Seite zu verringern. Sie können die anderen Antworten, die das gleiche Gefühl repräsentieren, positiv bewerten.
Mickmackusa
2

DEPRECATED - Dieser Teil ist veraltet, verwenden Sie ihn also nicht.

Sie können diesen Code auch ausprobieren, wenn Sie beispielsweise später dynamische Formulare hinzugefügt haben. Sie haben beispielsweise ein asynchrones Fenster mit Ajax geladen und möchten dieses Formular senden.

$('#cpa-form').live('submit' ,function(e){
    e.preventDefault();      
    // do something
});

UPDATE - Sie sollten die Methode jQuery on () verwenden und versuchen, das Dokument-DOM anzuhören, wenn Sie dynamisch hinzugefügten Inhalt verarbeiten möchten.

Fall 1, statische Version: Wenn Sie nur wenige Listener haben und Ihr zu handhabendes Formular fest codiert ist, können Sie direkt auf "Dokumentebene" abhören. Ich würde die Listener nicht auf Dokumentebene verwenden, aber ich würde versuchen, tiefer in den Doom Tree einzusteigen, da dies zu Leistungsproblemen führen könnte (abhängig von der Größe Ihrer Website und Ihrem Inhalt).

$('form#formToHandle').on('submit'... 

ODER

$('form#formToHandle').submit(function(e) {
    e.preventDefault();      
    // do something
});

Fall 2, dynamische Version: Wenn Sie das Dokument bereits in Ihrem Code anhören, ist dieser Weg gut für Sie. Dies funktioniert auch für Code, der später über DOM oder dynamisch mit AJAX hinzugefügt wurde.

$(document).on('submit','form#formToHandle',function(){
   // do something like e.preventDefault(); 
});

ODER

$(document).ready(function() {
    console.log( "Ready, Document loaded!" );

    // all your other code listening to the document to load 

    $("#formToHandle").on("submit", function(){
        // do something           
    })
});

ODER

$(function() { // <- this is shorthand version
   console.log( "Ready, Document loaded!" );

    // all your other code listening to the document to load 

    $("#formToHandle").on("submit", function(){
        // do something           
    })
});
NFlows
quelle
7
.live()ist seit jQuery 1.7 veraltet und seit 1.9 entfernt. Verwenden Sie .on()stattdessen.
Hank
0

Hallo suchte nach einer Lösung, um ein Ajax-Formular mit Google Tag Manager (GTM) zum Laufen zu bringen. Die Rückgabe false verhinderte den Abschluss und die Übermittlung der Aktivierung des Ereignisses in Echtzeit auf Google Analytics-Lösung bestand darin, die Rückgabe false durch e.preventDefault () zu ändern. ;; das richtig funktioniert folgt dem Code:

 $("#Contact-Form").submit(function(e) {
    e.preventDefault();
   ...
});
Navi
quelle
0

e.preventDefault () funktioniert nur dann einwandfrei, wenn Sie keine Probleme mit Ihren Javascripts haben. Überprüfen Sie Ihre Javascripts, wenn e.preventDefault () nicht funktioniert. Möglicherweise funktionieren auch einige andere Teile Ihres JS nicht

ndoty
quelle
0

Nun, ich bin auf ein ähnliches Problem gestoßen. Das Problem für mich ist, dass die JS-Datei geladen wird, bevor das DOM-Rendering stattfindet. Bewegen Sie sich also <script>zum Ende des <body>Tags.

oder verwenden Sie aufschieben.

<script defer src="">

Seien Sie also versichert, e.preventDefault()dass es funktionieren sollte.

Vignesh Krieg
quelle