是否有可能自動顯示/隱藏ajax加載gif,並同時禁用/啓用提交按鈕?jquery自動加載gif和按鈕禁用提交點擊
$("#save_button_id").click(function() {
if ($('#save_button_id').hasClass('ui-state-disabled')) return false;
Save();
});
function Save() {
StartAjax($("#save_button_id"));
$.ajax({
success: function (data) {
EndAjax($("#save_button_id"));
// etc...
},
error: function (xhr, status, error) {
EndAjax($("#save_button_id"));
// etc ...
}
});
}
function StartAjax(button) {
DisableButtonClick(button);
$("#ajaxLoad").show();
}
function EndAjax(button) {
EnableButtonClick(button);
$("#ajaxLoad").hide();
}
我見過幾個地方說說如何使用.ajaxStart:提交時,我這樣做(當提交按鈕是一個風格<一>不是輸入類型=提交)
目前()自動顯示加載gif,但是是否也可以找到對被點擊的按鈕(樣式爲< a>標籤)的引用,並自動禁用/啓用它?
這樣做的關鍵在於不必每次都手動輸入Start/EndAjax,並確保應用程序在任何地方都一致。
編輯
無答案爲止提供自動化的 - 任何解決方案(如我上面的電流之一),你必須之前和之後的每一個$就(手動輸入開始/結束)導致維修問題:它很容易忘記將開始/結束放在一些$ .ajax()調用旁邊,如果您想稍後改變它的工作方式,則需要通過每一個來完成更改。
EDIT 2 - 澄清地點Re .delegate()建議
你說:「你可以將你的事件處理程序任何元素」 - 但我想它附加到每按鈕元素( DRY):所以我已經修改了你的建議的第1部分是:
$('div#buttons a.ui-icon').each(function(index) {
$(this).ajaxStart(function() {
$("#ajaxLoad").show();
});
});
這解決了第一個問題,那就是如何顯示加載.gif注意任何按鍵,而無需重複輸入「 $(「#ajaxLoad」)。show()「無處不存在$ .ajax()調用。
下一部分是如何禁用任何按鈕,當它被點擊(再次沒有重複的代碼) - 你建議.delegate()。但在你的例子中,每個按鈕點擊都會調用Save()方法。 (我改變了選擇,以配合我的HTML)
$('div#buttons a.ui-icon').delegate('button:not(.ui-state-disabled)', 'click', function() {
$(this).toggleClass('ui-state-disabled');
Save(); // this line needs replacing with a call to $(this).something
});
的問題,這是$(本)並不總是保存按鈕(選擇返回所有的按鈕),這可能是刪除按鈕或取消按鈕等等。所以調用$(this).toggleClass很好,但是調用Save()意味着你調用了錯誤的函數。所有這些按鈕已經有了。點擊方法:
$("#SaveButton").click(function() {
Save();
});
$("#DeleteButton").click(function() {
Delete();
});
因此,這是一個需要被稱爲原始點擊功能,它說:$(本)以上.something。在這一點上,它應該叫做原始點擊 - 或者說更準確的說它應該會泡到最初的.click。 .delegate必須更通用,原始的.click將提供具體的實現。
作爲對您的編輯的迴應:您必須在某個點或另一個點上定義這些內容;沒有逃脫的。一種可能的解決方案是自己創建一個重疊的ajax函數,比如'doAjax(...,...)',包括jQuery的'$ .ajax'和按鈕操作。但是這取決於你在這裏試圖做什麼(不同的事情),這個重疊的功能是否可以保持簡單或者變得非常複雜並且失去了它的所有優點。 – Alec 2010-05-21 01:47:04