我在我的HTML頁面中有一個表單,其中包含一個標籤,一個輸入字段和一個提交按鈕。這裏是一個例子:如何停止HTML/jQuery中的雙表單提交?
<form id="myForm" action="#">
<label for="myField">My field</label>
<input type="text" id="myField" name="myField" class="required">
<input type="submit" value="Send" />
</form>
在我的JavaScript代碼中,我使用jQuery將事件處理程序綁定到提交事件。 此事件處理程序覆蓋默認提交操作。它驗證表單,執行動畫,然後使用ajax調用將字段值提交給服務器。這裏是一個例子:
$("#myForm").bind("submit", function() {
var valid = $("#myForm").validate().form();
if (valid) {
var val = $("#myField").val();
$("#myForm").animate(/* blah */, function() {
$.ajax({
// ajax call here...
});
});
}
return false; // cancel default submit action
});
請注意,這是一個簡化的例子,我的真實代碼更復雜;我也有不同行爲的多種形式。
現在,我正在尋找一個優雅的解決方案,以避免重新進入:目前,用戶可以多次點擊返回鍵,這將導致我的事件處理程序被多次調用,因此多個動畫和ajax要求。我不能簡單地在處理程序中解除綁定/重新綁定,因爲處理程序正在重寫默認的提交行爲。此外,處理程序本身將回調函數添加到其他函數:animate()和ajax()。
我能想到的唯一解決辦法是增加一個布爾信號,我設置爲true/false作爲在下面的示例:
var myFormSubmitExecuting = false;
$("#myForm").bind("submit", function() {
if (myFormSubmitExecuting) return;
myFormSubmitExecuting = true;
var valid = $("#myForm").validate().form();
if (valid) {
var val = $("#myField").val();
$("#myForm").animate(/* blah */, function() {
$.ajax({
// ajax call here...
// when done :
myFormSubmitExecuting = false;
});
});
} else {
myFormSubmitExecuting = false;
}
return false; // cancel default submit action
});
,我寧願我可以寫一次通用的解決方案,適用於我所有的表格。有什麼建議麼?
您可以將信號添加到表單本身,而不是像'$(this).data(「SubmitExecuting」,true)'這樣的全局變量。 –