2012-01-11 9 views
13

Ho una funzione aggiuntiva da eseguire prima di inviare il modulo. Questo non sta facendo il trucco.Come ritardo di invio di un modulo

$('form').submit(function(event) { 
    var formId = $(this).attr('id'); 
    mySpecialFunction(formId); 

    event.preventDefault(); 

    setTimeout(function() { 
     $(this).submit(); 
    }, 300); 

}); 

Questo non funziona ovviamente.

risposta

28

È necessario attivare l'evento sull'elemento modulo stesso, non su una selezione jQuery. (In realtà, si erano neanche selezionare l'elemento di forma - all'interno setTimeout, this è l'oggetto globale.)

Cache riferimento alla forma (this) e chiamare il metodo submit:

$('form').submit(function(event) { 
    var formId = this.id, 
     form = this; 
    mySpecialFunction(formId); 

    event.preventDefault(); 

    setTimeout(function() { 
     form.submit(); 
    }, 300); 
}); 

Nota che ho anche sostituito la tua inefficiente chiamata $(this).attr('id') con this.id. Si noti inoltre che è necessario chiamare il metodo di invio dell'elemento del modulo DOM, non il metodo jQuery, in modo che il gestore di eventi jQuery non sia attivato, il che causerebbe un ciclo infinito (e totalmente inefficace).

+0

I ho provato questo, ma FireBug dice che form.submit() non è una funzione. Sto usando jQuery 1.7.1. – Chris

+0

@Chris Hai usato il codice esatto nella mia risposta? – lonesomeday

+0

Ya, posso farlo funzionare su JSFiddle, ma non sulla mia pagina. Sto caricando jQuery in modo dinamico, quindi potrebbe essere correlato a questo. hrmm – Chris

1
$('form').submit(function(event) { 
    var formId = this.id, 
       $this = $(this); 

    mySpecialFunction(formId); 

    event.preventDefault(); 
    $this.unbind("submit"); 
    setTimeout($.proxy($.fn.submit, $this), 300); 

}); 
1

Provare a separare l'evento di invio e all'interno del setTimeout fare riferimento al "questo" corretto anziché alla finestra.

$(this).unbind("submit"); 
var self = this; 
setTimeout(function() { 
    $(self).submit(); 
}, 300); 
0

Ecco perché l'evento di invio viene chiamato più e più volte, ma impedisce l'invio a causa di preventDefault. O separare l'evento di invio dopo che la funzione è stata eseguita, o utilizzare un valore booleano per impostare e verificare se è già stato eseguito.

1

è possibile impostare una richiamata nella funzione

$('form').submit(function(event) { 
    var formId = $(this).attr('id'); 

    mySpecialFunction(formId, $(this).doWhatever(formId); 

    event.preventDefault(); 
}); 

function mySpecialFunction(id, onComplete) { 

    if ($.isFunction(onComplete)) { 
     onComplete.call(this); 
    } 
} 
0

anche possibile con il metodo di ritardo jquery:

$(function() { 
    $('#the_form').delay(300).submit(); 
}); 
0

un altro piccolo codice per ritardare forma presentare come segue

$('form').submit(function (e) { 
    var form = this; 
    e.preventDefault(); 
    setTimeout(function() { 
     form.submit(); 
    }, 1000); // in milliseconds 

    $("<p>Delay...</p>").appendTo("body"); 
}); 
Problemi correlati