Проблема в том, что нет общего способа определить, когда выполняется асинхронный вызов. Вам нужно будет установить какой-нибудь флаг после того, как AJAX-вызов (например) завершен, и опросить его с помощью setInterval.
С синхронными функциями браузер, вероятно, не будет обновлять отображение, пока обработчик щелчков не будет выполнен, так что вы никогда не увидите активное состояние. Вы можете обойти это, используя setTimeout, чтобы удалить активный класс через 1/10 секунды. Для этого случая вы можете написать такую функцию:
function makeClickHandler(innerFunction) {
return function(event) {
var self = this;
$(self).addClass('active');
innerFunction.call(self, event);
window.setTimeout(function() {
$(self).removeClass('active');
}, 100);
}
}
Вы можете обернуть любые обработчики кликов в функцию makeClickHandler:
$(".button").click(makeClickHandler(function() { alert('clicked'); }));
Вот пример того, как вы можете обрабатывать асинхронные события, но на этом этапе может быть проще добавить / удалить класс в отдельных обработчиках событий.
function makeAsyncClickHandler(innerFunction) {
return function(event) {
var self = this;
$(self).addClass('active').data("done", false);
innerFunction.call(self, event);
var intervalID = window.setInterval(function() {
if ($(self).data("done")) {
$(self).removeClass('active');
window.clearInterval(intervalID);
}
}, 100);
}
}
Внутренняя функция должна вызывать
$(this).data("done", true);
когда асинхронная часть закончена.
Вероятно, было бы проще написать функции «начало» и «завершение», которые можно вызывать для элемента в начале функции и после завершения события.