выполнение jQuery onClick
-
02-07-2019 - |
Вопрос
У меня есть этот фрагмент JavaScript, написанный с помощью jQuery 1.2.5.Он содержится внутри основной функции() плагина, который я написал.Плагин представляет собой горизонтальный скроллер галереи, очень похожий на jCarousel.Он выполняет множество автоматических расчетов ширины и определяет, сколько прокручивать, исходя из этого и размера изображений, и именно это и происходят все вычисления.
У меня вопрос: как мне предотвратить срабатывание до завершения предыдущего выполнения?Например, если я немного щелкну счастливым и просто лихорадочно нажму на .digi_next
.Когда это происходит, в пользовательском интерфейсе дела идут не так хорошо, и я бы хотел это исправить :) Я подумал, что ответ может заключаться в queue
, но все мои попытки его использования не дали ничего путного.
var self = this;
$(".digi_next", this.container).click(function(){
var curLeft = $(".digi_container", self.container).css("left").split("px")[0];
var newLeft = (curLeft*1) - (self.containerPad + self.containerWidth) * self.show_photos;
if (newLeft < ((self.digi_gal_width - (self.containerPad + self.containerWidth) * self.show_photos)) * -1) {
newLeft = ((self.digi_gal_width - (self.containerPad + self.containerWidth) * self.show_photos)) * -1;
}
$(".digi_container", self.container).animate({
left: newLeft + "px"
}, self.rotateSpeed);
});
Решение
Просто используйте глобальный флаг занятости.Когда вы вводите обработчик кликов, проверьте его и продолжайте, только если он ложный.Сразу установите для него значение true, а затем снова установите его в значение false, когда анимация закончится.JavaScript является однопоточным, поэтому не стоит беспокоиться о состоянии гонки.
var busy = false;
$("...").onclick(function() {
if (busy) return false;
busy = true;
$("...").animate(..., ..., ..., function() {
busy= false;
});
return false;
});
Другие советы
Взгляни на jQuery пользовательский интерфейс.Конкретно часть эффектов вилки.Я использую слайд-эффект на мой личный сайт (нажимайте на стрелки по бокам ящиков).
Я запрещаю пользователям запускать эффект более одного раза (до того, как эффект закончится) с помощью один обработчик события и функция обратного вызова.
В качестве альтернативы упомянутому глобальному флагу вы можете присвоить значение элементу DOM, таким образом позволяя нескольким элементам на странице иметь одинаковое поведение:
$("...").onclick(function(el) {
var self = el;
if (self.busy) return false;
self.busy = true;
$("...").animate(..., ..., ..., function() {
self.busy= false;
});
return false;
});
Поскольку вызовы функций JavaScript являются асинхронными, вы можете передать в качестве параметра функцию обратного вызова, которая вызывается после завершения предыдущего вызова (то же самое для ошибок).
Вы можете передать функцию, которую вы написали в этом посте, в качестве обратного вызова для функции, которая запускалась ранее.
Надеюсь это поможет.
С уважением