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();
  });

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

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/


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.


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.


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();
});

Cela fonctionne parfaitement pour moi sur une page où j'ai un formulaire côté client dans un formulaire côté serveur.
Liknes le


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();
  });
}

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

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();
   ...
});

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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.