2015-06-12 4 views
0

Остановите несколько анимаций при одновременном нажатии кнопки несколько раз, пока анимация не будет завершена с помощью следующего кода.
объявить один глобальной переменнойОстановите несколько анимаций до завершения другой анимации

var animateFinish = true; 

И вот я начинаю с клик действия

$('#button').on('click', function(e){ 
    if(animateFinish){ 
     animateFinish = false; 
     $('.selector').animate({'margin-left':'100px'},"fast",'linear',function(){ 
      animateFinish = true; 
     } 
    } 
} 

1. Глобально объявить переменную как True (animateFinish).
2. Первый раз он удовлетворяет условиям.
3. Сразу же оно изменяется как ложное.
4. После завершения анимации он возвращается.
5. Теперь, если вы проверите его, пока анимация не завершится, событие не будет анимировано.
Извините за мой английский.

+0

Приведенный выше код работает отлично для моей логики –

+1

я на самом деле думаю, что вы потенциально должны попытаться 'остановки()' любой продолжая анимацию, а не задерживая других. 'stop()' избавится от текущей анимации и начнется оттуда. Если вы хотите связать анимацию, вам не нужен animateFinish, так как у вас есть обратный вызов. Вы можете создать qeue функций и посмотреть, есть ли еще один оставшийся для выполнения после каждого обратного вызова animate. Проверьте 'queue()': http://api.jquery.com/queue/ – somethinghere

+0

queue() не работает согласно моим требованиям –

ответ

0

Лично в вашем случае я могу перейти с глобальной переменной var busy = false, а затем добавить это на ваш клик: if(busy) return; else busy = true;. В конце вашей анимации установите busy на номер false. Это не позволит вашему клику ничего делать, пока все не будет завершено.

Heres быстрый фрагмент кода, который показывает, что я имею в виду:

/* I use each here so that `busy` is only applied to each div individually. 
 
* That way every individual element has it's own `busy`. */ 
 
$("div").each(function(){ 
 
    var busy = false; 
 
    $(this).click(function(){ 
 
     /* Abort the click operation if busy is active*/ 
 
     if(busy) return; else busy = true; 
 
     /* Run the animation and deactivate busy on callback. */ 
 
     $(this).animate({left: 500}, 2000).animate({left:0}, 2000, function(){ 
 
      busy = false; 
 
     }); 
 
    }); 
 
});
div { 
 
    position: absolute; 
 
    left: 0; 
 
    top:0; 
 
    background: red; 
 
    width: 100px; 
 
    height: 100px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> 
 
<div>Click me!</div>

+0

Этот код достаточно хорош. Но мой сценарий похож: у меня есть ползунок контента, который содержит около 23 панелей/ящиков (не фиксированный, он динамический в моем случае). Если пользователь нажимает на следующую кнопку, вам нужно переместить поле 1panel влево на его ширину. Проблема в том, что если пользователь продолжает нажимать на следующую кнопку, эффекты анимации различаются, поэтому я должен заставить пользователя дождаться завершения анимации. Итак, я реализовал как выше. –

+0

@RanjithReddyKeesari Если вы переместите 'busy' вне' each', он будет глобальным и будет считаться для каждого из ваших полей, если это имеет смысл. Извините, это решение наилучшим образом из моего понимания вашей проблемы :) – somethinghere

Смежные вопросы