Empêcher le défaut sur le formulaire Soumettre jQuery

138

Quel est le problème avec ça?

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
la source
12
Fonctionne bien ici . Pouvez-vous publier plus d'informations dans votre question? Si vous êtes alert()dans le gestionnaire de soumission, est-ce qu'il est appelé? Sinon, il se peut qu'il y ait une erreur dans votre script qui empêche le gestionnaire d'événements d'être correctement câblé. Quelque chose dans la console d'erreur?
Ville du
3
Ce lien est interne et ne nous sert à rien.
Steve Robbins
Peut-être qu'une version plus ancienne a été mise en cache. Il semble fonctionner maintenant.
djreed le
1
duplication possible de event.preventDefault () vs return false
Liam
2
! Assurez-vous que le code javascript s'exécute une fois que DOM est prêt.
2015

Réponses:

175

Essaye ça:

$("#cpa-form").submit(function(e){
    return false;
});
Jordan Marron
la source
12
Cela fonctionne, mais pourquoi la méthode préférée de preventDefault ne fonctionne-t-elle pas?
MikeJ
26
Voir cette question pour une meilleure explication: stackoverflow.com/questions/1357118/…
Jordan Brown
8
C'est la mauvaise réponse. e.preventDefault()fonctionne bien avec une soumission de formulaire, le problème résidait ailleurs dans le code de l'OP. L'utilisation return false pourrait entraîner des conséquences inattendues.
Chuck Le Butt
58

Utilisez la nouvelle syntaxe d'événement «on».

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

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

scarver2
la source
2
Salut. Cela ne fonctionne pas pour moi. (oui, je mets mon code à l'intérieur $(document).ready()) Comment le faire fonctionner?
Gui Imamura
1
@GuiImamura Besoin de plus d'informations. Avez-vous défini la variable valide sur trueou false? Pouvez-vous recréer votre code dans jsfiddle.net et envoyer le lien? Essayez d'ajouter un alert()pour confirmer que la fonction se déclenche. Certaines personnes ont signalé que l'ajout e.stopPropagation();après e.preventDefault();arrête le déclenchement d'autres événements enchaînés.
scarver2
Bonjour, j'utilise $('#myFormID').validationEngine('validate')depuis jQuery validationEngine comme variable valid, pour vérifier si l'entrée est une adresse e-mail valide. Néanmoins, je veux qu'il empêche le comportement par défaut de toute façon; doit preventDefaultêtre à l'intérieur du bloc if, pas avant?
Gui Imamura du
@GuiImamura Heureux d'apprendre que vous l'avez fait fonctionner. Le se preventDefaulttrouve à l'intérieur du bloc sinon valide pour arrêter la soumission du formulaire. En d'autres termes, s'il est valide , utilisez le comportement par défaut du formulaire.
scarver2 du
13

Je crois que les réponses ci-dessus sont toutes correctes, mais cela ne montre pas pourquoi la submitméthode ne fonctionne pas.

Eh bien, la submitméthode ne fonctionnera pas si jQuery ne peut pas obtenir l' formélément, et jQuery ne donne aucune erreur à ce sujet. Si votre script est placé dans l'en-tête du document, assurez-vous que le code s'exécute après DOMest prêt . Alors, $(document).ready(function () { // your code here // });résoudra le problème.

La meilleure pratique est de toujours mettre votre script au bas du document.

étourdi
la source
11

C'est une question ancienne, mais la réponse acceptée ici ne va pas vraiment à la racine du problème.

Vous pouvez résoudre cela de deux manières. Tout d'abord avec jQuery:

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

     e.preventDefault();

  });
}

Ou sans 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();

});

Vous n'avez pas besoin d'utiliser return falsepour résoudre ce problème.

Chuck Le Butt
la source
J'ai remplacé l'écouteur d'événement natif js au lieu de l'écouteur d'événement jquery et ça marche. merci pour l'idée.
Orhan Gazi
6
$('#cpa-form input[name="Next"]').on('click', function(e){
    e.preventDefault();
});
Crisalin Petrovschi
la source
Cela fonctionne parfaitement pour moi sur une page où j'ai un formulaire côté client dans un formulaire côté serveur.
Liknes le
3
$(document).ready(function(){
    $("#form_id").submit(function(){
        return condition;
    });
});
shraddha Dharmamer
la source
2

Votre code est parfait, il vous suffit de le placer dans la fonction prête.

$(document).ready( function() {
  $("#cpa-form").submit(function(e){
     e.preventDefault();
  });
}
Jai Kathuria
la source
Ce conseil est déjà fourni par d'autres réponses. Veuillez supprimer cette réponse pour réduire le gonflement des pages. Vous pouvez voter pour les autres réponses qui représentent le même sentiment.
mickmackusa
2

DEPRECATED - cette partie est obsolète, veuillez donc ne pas l'utiliser.

Vous pouvez également essayer ce code, si vous avez par exemple ajouté des formulaires dynamiques ultérieurement. Par exemple, vous avez chargé une fenêtre asynchrone avec ajax et souhaitez soumettre ce formulaire.

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

UPDATE - vous devez utiliser la méthode jQuery on () et essayer d'écouter le DOM du document si vous souhaitez gérer le contenu ajouté dynamiquement.

Cas 1, version statique: Si vous n'avez que quelques écouteurs et que votre formulaire à gérer est codé en dur, alors vous pouvez écouter directement au «niveau document». Je n'utiliserais pas les écouteurs au niveau du document mais j'essaierais d'aller plus loin dans l'arbre du destin car cela pourrait entraîner des problèmes de performances (cela dépend de la taille de votre site Web et de votre contenu)

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

OU

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

Cas 2, version dynamique: Si vous écoutez déjà le document dans votre code, alors cette méthode serait bonne pour vous. Cela fonctionnera également pour le code qui a été ajouté plus tard via DOM ou dynamique avec AJAX.

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

OU

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

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

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

OU

$(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
la source
7
.live()est obsolète depuis jQuery 1.7 et supprimé depuis la 1.9. Utilisez .on()plutôt.
Hank
0

Bonjour cherchait une solution pour faire fonctionner un formulaire Ajax avec Google Tag Manager (GTM), le retour false empêchait l'achèvement et soumettait l'activation de l'événement en temps réel sur la solution google analytics était de modifier le retour false par e.preventDefault () ; qui a fonctionné correctement suit le code:

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

e.preventDefault () ne fonctionne bien que si vous n'avez pas de problème sur vos javascripts, vérifiez vos javascripts si e.preventDefault () ne fonctionne pas, il y a des chances que d'autres parties de votre JS ne fonctionnent pas aussi

ndoty
la source
0

Eh bien, j'ai rencontré un problème similaire. Le problème pour moi est que le fichier JS est chargé avant le rendu DOM. Alors déplacez-vous <script>à la fin de<body> balise.

ou utilisez différer.

<script defer src="">

alors soyez assuré que cela e.preventDefault()devrait fonctionner.

Guerre de Vignesh
la source