У меня есть этот фрагмент javascript, написанный с помощью jQuery 1.2.5. Он содержится внутри функции main () написанного мной плагина. Плагин представляет собой горизонтальный скроллер галереи, очень похожий на 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);
});
Я разберусь, спасибо. Я просто использовал 1.2.5, потому что он входит в наше решение и у меня нет возможности изменить его, но я знаю, кто его использует ...>.>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку вызовы функций JavaScript являются асинхронными, вы можете передать в качестве параметра in функцию обратного вызова, которая вызывается при завершении предыдущего вызова (то же самое для ошибок).
Вы можете передать функцию, которую вы написали в этом посте, в качестве обратного вызова для функции, которая запускалась ранее.
Надеюсь это поможет.
С Уважением
Просто используйте глобальный флаг занятости. Когда вы вводите свой обработчик кликов, проверьте его и продолжайте, только если он ложный. Немедленно установите для него значение true, а затем снова установите значение false, когда анимация закончится. JavaScript является однопоточным, поэтому беспокоиться не о чем.
var busy = false;
$("...").onclick(function() {
if (busy) return false;
busy = true;
$("...").animate(..., ..., ..., function() {
busy= false;
});
return false;
});
Взгляните на jQuery UI. В частности, часть эффектов плагина. Я использую слайд-эффект на мой личный сайт (щелкайте стрелки по бокам полей).
Я не позволяю пользователям запускать эффект более одного раза - до того, как эффект закончится - с помощью один обработчик событий и функции обратного вызова.
В качестве альтернативы предоставленному глобальному флагу вы можете присвоить значение элементу DOM, что позволит нескольким элементам на странице иметь одинаковое поведение:
$("...").onclick(function(el) {
var self = el;
if (self.busy) return false;
self.busy = true;
$("...").animate(..., ..., ..., function() {
self.busy= false;
});
return false;
});
примечание: я настоятельно рекомендую jQuery v1.2.6, так как выпуск для 1.2.5 был искажен, а в 1.2.6 есть важные исправления ошибок