Как отложить форму от отправки
У меня есть дополнительная функция для выполнения, прежде чем я отправлю форму. Это не делает трюк.
$('form').submit( function(event) {
var formId = $(this).attr('id');
mySpecialFunction(formId);
event.preventDefault();
setTimeout( function () {
$(this).submit();
}, 300);
});
Это не работает явно.
Ответы
Ответ 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();
});