Как остановить события клика от очередей на несколько кликов?
Что мне нужно сделать, так это то, что если мы нажмем кнопку "Отправить", должен появиться конкретный элемент div. Вот мой код: http://jsfiddle.net/7tn5d/ Но если я нажимаю кнопку "Отправить" несколько раз, функция вызывает своего рода очередь и запускается одна за другой. Есть ли способ сделать недействительными другие клики, когда текущая анимация запущена? Код:
animating = 0;
doneanim = 0;
$(function () {
$("#submit_tab").click(function (e) {
if (animating == 1) return;
animating = 1;
$("#submit_cont").show("blind", {}, 1000);
animating = 0;
});
});
6 ответов
Вы почти правильно поняли семафор! Просто в jQuery show()
, вы должны будете поставить сброс семафора в качестве аргумента. Вот исправленная версия - http://jsfiddle.net/snikrs/xe5A3/
animating = 0;
doneanim = 0;
$(function () {
$("#submit_tab").click(function (e) {
if (animating == 1) return;
animating = 1;
$("#submit_cont").show("blind", 1000, function() {
animating = 0;
});
});
});
Чтобы предотвратить выполнение действия несколько раз, просто прекратите предыдущую анимацию. Так:
$('#submit_cont').stop().show("blind",{},1000);
Однако я заметил, что вы пытались предотвратить запуск анимации, если анимация уже запущена. Хотя для показа div требуется 1 секунда или 1000 миллисекунд, выполнение условия не приостанавливается, пока анимация не будет завершена. Вы должны определить функцию для запуска после завершения анимации, например так:
animating = 0;
doneanim = 0;
$(function () {
$("#submit_tab").click(function (e) {
if (animating == 1) return;
animating = 1;
$("#submit_cont").show("blind", 1000, function() { animation = 0; });
});
});
Надеюсь, что это помогло...
Вы можете использовать :animated
селектор для проверки:
$(function () {
$("#submit_tab").click(function (e) {
var $cont = $("#submit_cont");
if (!$cont.is(':animated')) {
$cont.show("blind", {}, 1000);
}
});
});
Теперь, если вы придерживаетесь идеи внешнего семафора, то лучше придерживаться этого с помощью .data()
вместо использования глобальной переменной:
$(function () {
$("#submit_tab").click(function (e) {
var $cont = $('#submit_cont'),
animating = $cont.data('isAnimating');
if (animating) {
return;
} else {
$cont.data('isAnimating', 1);
$("#submit_cont").show("blind", 1000, function() { $cont.data('isAnimating', 0); });
}
});
});
Вы можете добавить $("#submit_cont").clearQueue();
после окончания анимации:
$("#submit_tab").click(function (e) {
$("#submit_cont").show("blind", 1000, function() {
$("#submit_cont").clearQueue();
});
});
Как то так ( см. Документацию):)
$("#submit_cont").show("blind", function(){
animating = 0;
});
Я нашел для этого другое решение, которое, на мой взгляд, выглядит чище:
var tab = $("submit_tag");
tab.on("click", function(){
var cont = $("submit_cont");
var animating = tab.queue("fx").length;
if(animating === 0){
cont.show("blind", {}, 1000);
}
});