Utilizzo di JQuery - impedisce l'invio del modulo


178

Come posso impedire l'invio di un modulo tramite jquery?

Ho provato di tutto: vedi 3 diverse opzioni che ho provato di seguito, ma non funzionerà:

    $(document).ready(function() { 

            //option A
            $("#form").submit(function(e){
                e.preventDefault();
            });

            //option B
            $("#form").submit(function(e){
                stopEvent(e);
            });

            //option C
            $("#form").submit(function(){
                return false;
            });
    });

Cosa potrebbe esserci di sbagliato?

Aggiornamento: ecco il mio HTML:

    <form id="form" class="form" action="page2.php" method="post"> 
       <!-- tags in the form -->
       <p class="class2">
           <input type="submit" value="Okay!" /> 
       </p>
    </form>

C'è qualcosa che non va qui?


Mostra il tuo HTML perché non c'è nulla di sbagliato in preventDefault o restituisci false quando lo hai pubblicato, a parte il fatto che il tuo selettore è totalmente sbagliato.
— Sparky,

1
return false;dopo che ha .submit()funzionato per me! Avevo lo stesso problema
— d -_- b

Se si verifica un errore JavaScript nel gestore, il e.preventDefault();codice non viene raggiunto / eseguito.
— Tom,

Risposte:


263

Due cose si distinguono:

  • È possibile che il nome del tuo modulo non lo sia form. Piuttosto, fai riferimento al tag rilasciando il #.
  • Anche la e.preventDefaultsintassi JQuery è corretta, ad es

        //option A
        $("form").submit(function(e){
            e.preventDefault();
        });

Anche l'opzione C dovrebbe funzionare. Non ho familiarità con l'opzione B

Un esempio completo:

<html>
    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

        <script type='text/javascript'>
         $(document).ready(function() {
            //option A
            $("form").submit(function(e){
                alert('submit intercepted');
                e.preventDefault(e);
            });
        });
        </script>
    </head>

    <body>
        <form action="http://google.com" method="GET">
          Search <input type='text' name='q' />
          <input type='submit'/>
        </form>
    </body>
</html>

2
Qualcos'altro non va. Sto usando questa tecnica su base giornaliera. La migliore ipotesi sarebbe che ci siano errori JavaScript nella pagina, forse controllalo con FireBug?
— Philip Fourie,

@LucyWeatherford, ho aggiornato la mia risposta con un esempio che funziona. Forse vedi qualcosa.
— Philip Fourie,

Nel tuo aggiornamento HTML ho notato che hai l'attributo di classe per il tuo modulo. Cambia il tuo selettore JQuery da $('#form')a $('.form')per gli attributi di classe.
— Philip Fourie,

1
Grazie! Ho finito per usare il tuo codice sulla stessa pagina, e ha funzionato, ancora non sono sicuro di cosa fosse sbagliato, ma ora va tutto bene. Grazie!
— Lucy Weatherford,

1
@ ÂngeloRigo e è semplicemente il nome che dai al parametro, in questo caso è l'evento submit.
— squall3d

34

Probabilmente hai pochi moduli sulla pagina e usando $ ('form'). Submit () aggiunge questo evento alla prima occorrenza del modulo sulla tua pagina. Utilizzare invece il selettore di classe o provare questo:

$('form').each(function(){
    $(this).submit(function(e){
        e.preventDefault();
        alert('it is working!');
        return  false;
    })
}) 

o versione migliore di esso:

$(document).on("submit", "form", function(e){
    e.preventDefault();
    alert('it works!');
    return  false;
});

1
Nel mio caso, restituire false era una chiave.
— elquimista

19

Per impedire l'impostazione predefinita / impedire l'invio del modulo, utilizzare

e.preventDefault();

Per interrompere il gorgoglio degli eventi, utilizzare

e.stopPropagation();

Per impedire l'invio del modulo, dovrebbe funzionare anche "return false".


Vedi questa risposta perché jQuery li gestisce in modo diverso. stackoverflow.com/questions/1357118/…
— Sparky

1
Controlla questo per capire quirksmode.org/js/events_order.html di bubling di
— L'Alfa del

2
Il jQuery sull'API afferma: "Restituire false da un gestore di eventi chiamerà automaticamente event.stopPropagation()e event.preventDefault(). Un falsevalore può anche essere passato per il gestore come scorciatoia per function(){ return false; }."
— Paul,

7

Ho anche avuto lo stesso problema. Ho anche provato quello che avevi provato. Quindi cambio il mio metodo non per usare jquery ma usando l'attributo "onsubmit" nel tag del modulo.

<form onsubmit="thefunction(); return false;"> 

Funziona.

Ma, quando ho provato a mettere il valore di ritorno falso solo in "thefunction ()", non impedisce il processo di invio, quindi devo mettere "return false;" nell'attributo onsubmit. Quindi, concludo che la mia domanda di modulo non può ottenere il valore restituito dalla funzione Javascript. Non ne ho idea.


1
È la differenza tra false;e return false;. Dovresti avereonsubmit="return thefunction();"
— xr280xr

4

Ho avuto lo stesso problema e ho risolto in questo modo (non elegante ma funziona):

$('#form').attr('onsubmit','return false;');

E ha il vantaggio, secondo me, che puoi ripristinare la situazione ogni volta che vuoi:

$('#form').attr('onsubmit','return true;');

Forse sarebbe un po 'più comodo rimuovere l'attributo quando si ripristina il modulo invia prevenzione$('#form').removeAttr('onsubmit');
— barbieswimcrew

4

Collegare l'evento all'elemento submit non all'elemento form. Ad esempio nel tuo HTML, fai così

$('input[type=submit]').on('click', function(e) {
    e.preventDefault();
});

2

Puoi semplicemente verificare se il modulo è valido se sì, esegui la logica di invio, altrimenti mostrerà un errore.

HTML

<form id="form" class="form" action="page2.php" method="post">
    <input type="text" class="check-validity" value="" />
    <input type="text" class="check-validity" value="" />
    <input type="text" class="check-validity" value="" />
    <input type="text" class="check-validity" value="" />
    <input type="text" class="check-validity" value="" />
    <input type="text" class="check-validity" value="" />
    <input type="text" class="check-validity" value="" />

    <input type="submit" value="Okay!" />
</form>

Javascript

    $(document).ready(function () {
        var isFormValid = true;

        function checkFormValidity(form){
            isFormValid = true;
            $(form).find(".check-validity").each(function(){
                var fieldVal = $.trim($(this).val());
                if(!fieldVal){
                    isFormValid = false;
                }
            });
        }


        //option A
        $("#form").submit(function (e) {
            checkFormValidity("#form");
            if(isFormValid){
                alert("Submit Form Submitted!!! :D");
            }else{
                alert("Form is not valid :(");
            }
            e.preventDefault();
        });
    });

1

Quando sto usando il <form>tag senza l'attributo id="form"e lo chiamo con il nome del suo tag direttamente in jquery, funziona con me.
il tuo codice nel file html:

<form action="page2.php" method="post">

e nello script di Jquery:

$(document).ready(function() {
      $('form').submit(function(evt){
          evt.preventDefault();// to stop form submitting
      });
 });

1

$('#form')cerca un elemento con id="form".

$('form') cerca l'elemento del modulo


0

Dimentichi l'ID del modulo e funziona

$('form#form').submit(function(e){
   e.preventDefault();
   alert('prevent submit');             
});


0

Anche questo sembra funzionare e potrebbe essere leggermente più semplice:

$('#Form').on('submit',function(){
    return false;
})

0

Utilizzando jQuery, è possibile effettuare le seguenti operazioni:

1- Utilizzare l'evento di invio modulo nativo con un pulsante Invia, impedendo al contempo che l'evento venga generato, quindi

2- Verifica il modulo Proprietà valida Questo può essere implementato come segue:

1- HTML:

 <form id="yourForm">
    <input id="submit" type="submit" value="Save"/>
</form>

2- Javascript

 $("form").on("submit", function (e) {
        e.preventDefault();
        if ($(this).valid()) {  
           alert('Success!');
        }
    });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.