2012-01-11 19 views
13

Mam dodatkową funkcję do wykonania przed przesłaniem formularza. To nie działa.Jak opóźnić formularz przed przesłaniem

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

    event.preventDefault(); 

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

}); 

To nie działa oczywiście.

Odpowiedz

28

Musisz wystrzelić zdarzenie na elemencie formularza, a nie na zaznaczeniu jQuery. (W rzeczywistości, nie były nawet wybranie elementu formularza - wewnątrz setTimeout, this to globalny obiekt).

Cache odniesienie do postaci (this) i wywołać jej submit metody:

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

    event.preventDefault(); 

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

Zauważ, że zastąpiłem twoje nieefektywne połączenie $(this).attr('id') z this.id. Zauważ także, że musisz wywołać metodę submit elementu formularza DOM, a nie metodę jQuery, tak aby procedura obsługi zdarzeń jQuery nie została uruchomiona, co spowodowałoby nieskończoną (i całkowicie nieskuteczną) pętlę.

+0

I "Próbowałem tego, ale FireBug mówi, że form.submit() nie jest funkcją. Używam jQuery 1.7.1. – Chris

+0

@Chris Użyłeś dokładnego kodu w mojej odpowiedzi? – lonesomeday

+0

Tak, mogę go uruchomić w JSFiddle, ale nie na mojej stronie. Ładuję jQuery dynamicznie, więc może to być związane z tym. 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

Spróbuj rozwiązać wiązanie z przesyłaniem, a w metodzie setTimeout odwołaj się do właściwego "tego" zamiast okna.

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

To dlatego, że wydarzenie złożyć nazywa się w kółko, ale uniemożliwia złożenie powodu preventDefault. Usuń powiązanie zdarzenia submit po wykonaniu funkcji lub użyj wartości logicznej, aby ustawić i sprawdzić, czy zostało już wykonane.

1

można ustawić wywołania zwrotnego w funkcji

$('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

również możliwe za pomocą metody opóźnienia jQuery:

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

kolejny mały kod opóźnić forma przedstawienia następująco

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

    $("<p>Delay...</p>").appendTo("body"); 
}); 
Powiązane problemy