ajax loading gif'in gösterilmesini/gizliliğini ve gönderme düğmesinin aynı anda devre dışı bırakılmasını/etkinleştirilmesini otomatikleştirmek mümkün mü? Birkaç yerde .ajaxStart nasıl kullanılacağı hakkında konuşmak gördüğümJQuery otomatik yükleme gif ve butonu devre dışı bırakmak için tıklayın
$("#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();
}
: Bunu gönderirken Şu
(zaman düğme tarz < a> bir giriş türüdür = submit)() yükleme gifini otomatik olarak göstermek için, ancak tıklatılan düğmeyi (stil sahibi bir < a> etiketi) bulmak ve otomatik olarak devre dışı bırakmak/etkinleştirmek mümkün mü?
Bunun anlamı, her seferinde Start/EndAjax'a manuel olarak yazmak ve uygulamanın her yerde tutarlı olduğundan emin olmaktır.
DÜZENLEME
cevaplar şu ana kadar teklif otomasyonu aitHiçbiri - el her $ .ajax (öncesi ve sonrası başlangıç / son yazmak zorunda (yukarıda benim şimdiki gibi) herhangi bir çözelti) bir bakım soruna neden : Başlangıç / bitiş değerini bazı $ .ajax() çağrılarının yanına yerleştirmeyi unutmak ve daha sonra nasıl çalışacağını değiştirmek isterseniz, değişikliği yapmak için her birinden geçmeniz gerekir. (Ama her düğmesi eleman ekleyin istiyorum -
DÜZENLEME 2 - .delegate() öneri
Sen "Sen herhangi eleman etkinlik işleyicisi ekleyebilirsiniz" yeniden noktayı açıklığa kavuşturmak KURU):! yüzden Önerinizin 1 parçası olmak değiştirdik:
$('div#buttons a.ui-icon').each(function(index) {
$(this).ajaxStart(function() {
$("#ajaxLoad").show();
});
});
Bu, nasıl herhangi bir düğme için yükleme .gif göstermektir ilk yöntem sorunu çözdü tekrar tekrar yazmak zorunda kalmadan " $ ("# ajaxLoad"). show() "her yerde bir $ .ajax() çağrısı var.
Bir sonraki kısım, tıklandığında herhangi bir düğmeyi nasıl devre dışı bırakacağınızdır (tekrar eden kod içermeyen) - .delegate() öğesini önerdiniz. Ancak, örneğinizde, her düğmenin tıklatılması Save() yöntemini çağırır. Bu sorun $ (this) kaydetmek düğmesi (seçici TÜM düğmeleri döndürür), bu silme düğmesi veya olabileceğini her zaman olmadığıdır
$('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
});
(benim html maç için seçici değişti) İptal düğmesi vb. Yani $ (this) .toggleClass çağırmak iyidir, ancak Save() çağırmak yanlış işlevi çağırıyor demektir. Yukarıda .something $ (this) yazan yere
$("#SaveButton").click(function() {
Save();
});
$("#DeleteButton").click(function() {
Delete();
});
Yani bu çağrılması gerekir orijinal tıklama fonksiyonudur: Tüm bu düğmeler zaten .click yöntem var. Bu noktada, orijinal tıklamayı çağırıyor olmalıydı - ya da belki daha sonra orijinal .click'e kadar kabarcık yapması gerektiğini söylemek daha doğru. .delegate daha genel olmalı ve orijinal .click özel uygulamayı sağlayacaktır.
Düzenlemenize yanıt olarak: bu şeyleri bir noktada tanımlamanız gerekir; bundan kaçış yok. Mümkün olan bir çözüm, jQuery'nin $ .ajax'ını ve düğme eylemlerini içeren 'doAjax (..., ...) 'diyerek üst üste binen bir ajax işlevi oluşturmak olacaktır. Ama gerçekten, bu örtüşen fonksiyonun basit kalacağı ya da inanılmaz derecede karmaşık ve bütün avantajlarını kaybedip kaybedemeyeceği konusunda, burada yapmaya çalıştığınız şeylere (çeşit çeşit şeyler) bağlıdır. – Alec