2012-01-11 50 views
13

Tôi có chức năng bổ sung để thực thi trước khi tôi gửi biểu mẫu. Đây không phải là việc làm.Làm cách nào để trì hoãn biểu mẫu gửi

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

    event.preventDefault(); 

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

}); 

Điều này không rõ ràng.

Trả lời

28

Bạn cần kích hoạt sự kiện trên chính phần tử biểu mẫu, chứ không phải trên lựa chọn jQuery. (Trong thực tế, bạn thậm chí không được chọn các yếu tố hình thức - bên setTimeout, this là đối tượng toàn cầu.)

cache một tham chiếu đến các hình thức (this) và gọi phương thức submit của nó:

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

    event.preventDefault(); 

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

Lưu ý rằng tôi cũng đã thay thế cuộc gọi $(this).attr('id') không hiệu quả của bạn với this.id. Cũng lưu ý rằng bạn phải gọi phương thức gửi của phần tử biểu mẫu DOM, không phải phương thức jQuery, để trình xử lý sự kiện jQuery không được kích hoạt, điều này sẽ gây ra một vòng lặp vô hạn (và hoàn toàn không hiệu quả).

+0

tôi đã thử điều này, nhưng FireBug nói form.submit() không phải là một hàm. Tôi đang sử dụng jQuery 1.7.1. – Chris

+0

@Chris Bạn đã sử dụng mã chính xác trong câu trả lời của tôi? – lonesomeday

+0

Ya, tôi có thể làm cho nó hoạt động trong JSFiddle, nhưng không phải trên trang của tôi. Tôi đang tải jQuery động, vì vậy nó có thể liên quan đến điều đó. 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

Cố gắng hủy liên kết sự kiện gửi và trong setTimeout, hãy tham khảo "this" thay vì cửa sổ.

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

Đó là do sự kiện gửi được gọi đi lặp đi lặp lại nhưng đang ngăn việc gửi vì ngăn chặnDefault. Hoặc hủy liên kết sự kiện gửi sau khi chức năng của bạn đã được thực hiện hoặc sử dụng giá trị boolean để đặt và kiểm tra xem nó đã được thực thi hay chưa.

1

bạn có thể đặt một callback trong chức năng của bạn

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

Cũng có thể với phương pháp jquery chậm trễ:

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

một mã nhỏ để trì hoãn hình thức nộp như sau

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

    $("<p>Delay...</p>").appendTo("body"); 
}); 
Các vấn đề liên quan