Impedisci impostazione predefinita su modulo Invia jQuery


138

Cosa c'è di sbagliato in questo?

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
Funziona bene qui . Puoi pubblicare ulteriori informazioni nella tua domanda? Se alert()nel gestore di invio viene chiamato? In caso contrario, è possibile che ci sia un errore nello script che impedisce al gestore eventi di essere cablato correttamente. Qualcosa nella console degli errori?
— Città

3
Tale collegamento è interno e non ci è utile.
— Steve Robbins,

Forse una versione precedente è stata memorizzata nella cache. Sembra funzionare ora.
— djreed


2
! Assicurati che il codice javascript venga eseguito dopo che DOM è pronto.
— rimorchiato il

Risposte:


175

Prova questo:

$("#cpa-form").submit(function(e){
    return false;
});

12
Funziona, ma perché il metodo preferito di preventDefault non funziona?
— MikeJ,

26
Vedi questa domanda per una spiegazione migliore: stackoverflow.com/questions/1357118/…
— Jordan Brown

8
Questa è la risposta sbagliata e.preventDefault()funziona bene con l'invio di un modulo, il problema risiede altrove nel codice del PO. L'uso return false potrebbe comportare conseguenze indesiderate.
— Chuck Le Butt,

58

Utilizzare la nuova sintassi dell'evento "on".

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

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


2
Ciao. Questo non funziona per me. (sì, ho inserito il mio codice $(document).ready()) Come faccio a farlo funzionare?
— Gui Imamura,

1
@GuiImamura Hai bisogno di maggiori informazioni. Hai impostato la variabile valida su trueo false? Puoi ricreare il tuo codice in jsfiddle.net e inviare il link? Prova ad aggiungere un alert()per confermare che la funzione è attiva. Alcune persone hanno riferito che l'aggiunta e.stopPropagation();dopo e.preventDefault();interrompe l'attivazione di altri eventi concatenati.
— scarver2,

Ciao, sto usando $('#myFormID').validationEngine('validate')da jQuery validation Engine come variabile valid, per verificare se l'input è un indirizzo e-mail valido. Tuttavia, lo voglio per impedire il comportamento predefinito in entrambi i casi; non preventDefaultdeve essere all'interno del blocco if, non prima?
— Gui Imamura,

@GuiImamura Sono contento di sentire che hai funzionato. La preventDefaultsi trova all'interno del se non valida blocco per fermare la presentazione del modulo. In altre parole, se valido , utilizzare il comportamento predefinito del modulo.
— scarver2,

13

Credo che le risposte di cui sopra siano tutte corrette, ma ciò non indica perché il submitmetodo non funziona.

Bene, il submitmetodo non funzionerà se jQuery non è in grado di ottenere l' formelemento e jQuery non fornisce alcun errore al riguardo. Se lo script è inserito nella parte superiore del documento, assicurarsi che il codice eseguito dopo DOMsia pronto . Quindi, $(document).ready(function () { // your code here // });risolverà il problema.

La migliore pratica è, metti sempre la tua sceneggiatura in fondo al documento.


11

Questa è una domanda antica, ma la risposta accettata qui non arriva davvero alla radice del problema.

Puoi risolvere questo in due modi. Innanzitutto con jQuery:

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

     e.preventDefault();

  });
}

O senza 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();

});

Non è necessario utilizzare return falseper risolvere questo problema.


Ho sostituito il listener di eventi js nativo invece del listener di eventi jquery ed è funzionante. grazie per l'idea.
— Orhan Gazi,

6
$('#cpa-form input[name="Next"]').on('click', function(e){
    e.preventDefault();
});

Questo funziona perfettamente per me su una pagina in cui ho un modulo lato client all'interno di un modulo lato server.
— Liknes,


2

Il tuo codice va bene, devi solo inserirlo nella funzione Pronto.

$(document).ready( function() {
  $("#cpa-form").submit(function(e){
     e.preventDefault();
  });
}

Questo consiglio è già fornito da altre risposte. Rimuovi questa risposta per ridurre il gonfiamento della pagina. Puoi votare le altre risposte che rappresentano lo stesso sentimento.
— Mickmackusa,

2

DEPRECATO - questa parte è obsoleta, quindi per favore non usarla.

Puoi anche provare questo codice, se ad esempio hai aggiunto moduli dinamici in seguito. Ad esempio hai caricato una finestra asincrona con ajax e vuoi inviare questo modulo.

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

AGGIORNAMENTO : è necessario utilizzare il metodo jQuery on () e provare ad ascoltare il documento DOM se si desidera gestire il contenuto aggiunto dinamicamente.

Caso 1, versione statica: se hai solo pochi ascoltatori e il tuo modulo da gestire è hardcoded, puoi ascoltare direttamente a "livello di documento". Non userei gli ascoltatori a livello di documento ma proverei ad approfondire l'albero del destino perché potrebbe portare a problemi di prestazioni (dipende dalle dimensioni del tuo sito Web e dai tuoi contenuti)

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

O

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

Caso 2, versione dinamica: se ascolti già il documento nel tuo codice, in questo modo andrebbe bene per te. Questo funzionerà anche per il codice che è stato aggiunto in seguito tramite DOM o dinamico con AJAX.

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

O

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

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

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

O

$(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()è obsoleto da jQuery 1.7 e rimosso da 1.9. Usa .on()invece.
— Hank,

0

Hello ha cercato una soluzione per far funzionare un modulo Ajax con Google Tag Manager (GTM), il reso false ha impedito il completamento e inviare l'attivazione dell'evento in tempo reale sulla soluzione di analisi di google è stato quello di modificare il reso falso da e.preventDefault () ; che ha funzionato correttamente segue il codice:

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

0

e.preventDefault () funziona bene solo se non hai problemi sui tuoi javascripts, controlla i tuoi javascripts se e.preventDefault () non funziona è probabile che alcune altre parti del tuo JS non funzionino anche


0

Bene ho riscontrato un problema simile. Il problema per me è che il file JS viene caricato prima che avvenga il rendering DOM. Quindi sposta il tuo <script>alla fine di<body> tag.

o usa il differimento.

<script defer src="">

quindi stai tranquillo e.preventDefault()dovrebbe funzionare.

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.