То, что у вас работает, но это немного расточительно, так как добавляет каждый раз при запуске функции обработчик новый ajaxStart
и ajaxComplete
, но я бы сделал одно предложение: измените ваш .unbind()
позвоните, чтобы быть более конкретным, так как у вас есть информация.Если вы измените это:
.unbind('click')
На это:
.unbind('click', updateClubName)
Вы можете иметь другие click
события без вмешательства .unbind()
, это будет только снимите привязку с одного обработчика.
Общая лучшая альтернатива ( для меня , вы можете обсудить, "лучше" ли это) без повторного связывания будет хранитьпеременная, чтобы знать, что вы в настоящее время публикуете, используя $.data()
и .data()
, например:
$j('#btnUpdateClubName').bind('click', updateClubName);
function updateClubName() {
if($.data(this, "posting")) return false; //are we posting? abort!
$.data(this, "posting", true); //set variable
var $this = $j(this);
var $spinner = $this.next('.spinner');
var renderURL = RES.BuildClubUpdateURL("UpdateClubName");
$this.attr("src", imgPathSaveAndUpdateBtnDisabled).addClass('wait-cursor');
$spinner.show();
$j.ajax({ type: "POST", data: $j('#hidStandingOrderId, #txtClubName, #clubOrderIdEditClubName').serialize(), url: renderURL, dataType: 'html', contentType: 'application/x-www-form-urlencoded',
success: function(data) {
// do some stuff
$spinner.hide();
$this.attr("src", imgPathSaveAndUpdateBtn).removeClass('wait-cursor')
.data("posting", false); //clear it out, ready to post again
$j("#cbEditClubName").colorbox.close();
}
});
}
При таком подходе, если вы делаетеa POST данные для «публикации» - true
, и будущие клики просто отбрасываются ... пока ответ не вернется и ваш код success
не будет запущен, кнопка будет снова включена.Это тот же эффект , но без дублирующих обработчиков и без повторного связывания.