Подтвердить что ты не робот

Как отложить форму от отправки

У меня есть дополнительная функция для выполнения, прежде чем я отправлю форму. Это не делает трюк.

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

    event.preventDefault();

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

}); 

Это не работает явно.

4b9b3361

Ответ 1

Вам нужно запустить событие на элементе формы, а не на выборе jQuery. (Фактически, вы даже не выбрали элемент формы - внутри setTimeout, this - глобальный объект.)

Запишите ссылку на форму (this) и вызовите ее метод submit:

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

    event.preventDefault();

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

Обратите внимание, что я также заменил ваш неэффективный вызов $(this).attr('id') на this.id. Также обратите внимание, что вы должны вызвать метод отправки элемента формы DOM, а не метод jQuery, чтобы обработчик события jQuery не запускался, что вызовет бесконечный (и полностью неэффективный) цикл.

Ответ 2

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

    mySpecialFunction(formId);

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

}); 

Ответ 3

Попробуйте отменить событие отправки, и в пределах setTimeout обратитесь к правильному "this", а не к окну.

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

Ответ 4

вы можете установить обратный вызов в своей функции

$('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);
    }
}

Ответ 5

Это потому, что событие submit вызывается снова и снова, но препятствует представлению из-за preventDefault. Либо отвяжите событие отправки после выполнения вашей функции, либо используйте значение boolean для установки и проверьте, выполнено ли это ранее.

Ответ 6

Также возможно с помощью метода задержки jquery:

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