Impedire il reindirizzamento del modulo O aggiornare all'invio?


96

Ho cercato in un sacco di pagine, ma non riesco a trovare il mio problema, quindi ho dovuto creare un post.

Ho un modulo che ha un pulsante di invio e, una volta inviato, desidero che NON si aggiorni O reindirizzi. Voglio solo che jQuery esegua una funzione.

Ecco il modulo:

<form id="contactForm">
    <fieldset>
        <label for="Name">Name</label>
        <input id="contactName" type="text" />
    </fieldset>

    <fieldset>
        <label for="Email">Email</label>
        <input id="contactEmail" type="text" />
    </fieldset>

    <fieldset class="noHeight">
        <textarea id="contactMessage" cols="20"></textarea>
        <input id="contactSend" class="submit" type="submit" onclick="sendContactForm()" />
    </fieldset>
</form>        
<small id="messageSent">Your message has been sent.</small>

Ed ecco jQuery:

function sendContactForm(){
    $("#messageSent").slideDown("slow");
    setTimeout('$("#messageSent").slideUp();$("#contactForm").slideUp("slow")', 2000);
}

Ho provato con e senza un elemento di azione nel modulo, ma non so cosa sto sbagliando. Quello che mi ha infastidito di più è che ho un esempio che lo fa perfettamente: Pagina di esempio

Se vuoi vedere il mio problema dal vivo, vai su stormink.net (il mio sito) e controlla la barra laterale dove dice "Inviami e email" e "Iscrizione RSS". Entrambe sono forme su cui sto cercando di farlo funzionare.

Risposte:


178

Gestisci semplicemente l'invio del modulo nell'evento di invio e restituisci false:

$('#contactForm').submit(function () {
 sendContactForm();
 return false;
});

Non hai più bisogno dell'evento onclick sul pulsante di invio:

<input class="submit" type="submit" value="Send" />

11
Ha funzionato come un fascino! E veloce come niente! Amo questo sito! Grazie mille.
Ian Storm Taylor il

3
Ricordo che il momento in cui ho appreso che si poteva restituire false da a da un submit a not submit è stato anche il momento in cui ho iniziato ad apprezzare molto il sistema Javascript / DOM.
Imagist

Sorprendente. Dove posso trovare i documenti delle specifiche che spiegano che falseimpedisce l'invio?
davide

7
dovresti davvero usare e.preventDefault () invece di restituire solo false ..
Juan

3
@RogerFilmyer ha sbagliato. se usi "return false;" stai anche interrompendo la propagazione, il che causerà problemi di UX. Ad esempio, se ti aspetti che un "clic" compaia o qualcosa del genere.
Juan

19

Qui:

function submitClick(e)
{
     e.preventDefault();
     $("#messageSent").slideDown("slow");
     setTimeout('$("#messageSent").slideUp();
     $("#contactForm").slideUp("slow")', 2000);
}

$(document).ready(function() {
    $('#contactSend').click(submitClick);
});

Invece di utilizzare l'evento onClick, utilizzerai l'associazione di un gestore di eventi "clic" utilizzando jQuery al pulsante di invio (o qualsiasi altro pulsante), che utilizzerà submitClick come callback. Passiamo l'evento al callback per chiamare preventDefault , che è ciò che impedirà al clic di inviare il modulo.


$ ('# contactSend'). click (submitClick (e)); Mi dice che 'e' non è definito ..: /
David Da Silva Contín

3
Dovrebbe essere $('#contactSend').click(function(e) { submitClick(e) });o$('#contactSend').click(submitClick);
Aaron

14

Nel tag di apertura del modulo, imposta un attributo di azione in questo modo:

<form id="contactForm" action="#">

2
+1 per soluzione semplice. Ma sfortunatamente la pagina si aggiornerà comunque la prima volta che l'utente preme Invio. Una cattiva soluzione sarebbe chiamare myForm.submit();il prima possibile, ma poi stai caricando la pagina due volte.
Ciclismo Linguista

non si aggiorna la prima volta.
Nearoo

Questa risposta deve essere respinta, perché NON risolve la domanda originale e peggiora la situazione cambiando effettivamente l'URL dopo che la pagina si è ricaricata. È necessario eseguire una e.preventDefault()o return falsel'altra nella funzione onsubmit. stackoverflow.com/questions/19454310/…
Jeff


6

Se desideri visualizzare gli errori del browser predefinito , ad esempio quelli attivati ​​dagli attributi HTML (visualizzati prima di qualsiasi trattamento JS del codice client):

<input name="o" required="required" aria-required="true" type="text">

Dovresti usare l' submitevento invece clickdell'evento. In questo caso verrà automaticamente visualizzato un popup che richiede " Compila questo campo ". Anche con preventDefault:

$('form').on('submit', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will show up a "Please fill out this field" pop-up before my_form_treatment

Come qualcuno ha menzionato in precedenza , return falseinterromperà la propagazione (cioè se ci sono più gestori allegati all'invio del modulo, non verrebbero eseguiti), ma, in questo caso, l'azione attivata dal browser verrà sempre eseguita per prima. Anche con un return falsealla fine.

Quindi, se vuoi sbarazzarti di questi pop-up predefiniti , usa l' clickevento sul pulsante di invio:

$('form input[type=submit]').on('click', function(event) {
   event.preventDefault();
   my_form_treatment(this, event);
}); // -> this will NOT show any popups related to HTML attributes

3

Una soluzione alternativa sarebbe quella di non utilizzare il tag del modulo e gestire l'evento di clic sul pulsante di invio tramite jquery. In questo modo non ci sarà alcun aggiornamento della pagina ma allo stesso tempo c'è uno svantaggio che il pulsante "invio" per l'invio non funzionerà e anche sui cellulari non avrai un pulsante vai (uno stile in alcuni cellulari). Quindi attenersi all'uso del tag del modulo e utilizzare la risposta accettata.

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.