Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.04.2013, 16:50
Новичок на форуме
Отправить личное сообщение для gogolinsky Посмотреть профиль Найти все сообщения от gogolinsky
 
Регистрация: 21.04.2013
Сообщений: 3

Ожидание окончания обработчика
Имеем:
Слайдер картинок.
И соответственно две кнопки: крутануть влево, крутануть вправо.
Обработчики событий кнопок:
$(".right").click(function() {
								slideLeft();	
								});
	$(".left").click(function() {
								slideRight();	
								});

Слайдер работает красиво. Но
Возникает некрасивое явление, если несколько раз быстро нажать на кнопку вправо (или влево). Картинки начинают скакать не по порядку и только со временем все устаканивается.
Как исправить код обработчиков событий, что б перед последующим нажатием на кнопку Вперед (Назад) сначала проходила проверка "а закончилась ли предыдущая анимация"?
Ответить с цитированием
  #2 (permalink)  
Старый 21.04.2013, 17:10
Аватар для Tek
Tek Tek вне форума
Профессор
Отправить личное сообщение для Tek Посмотреть профиль Найти все сообщения от Tek
 
Регистрация: 22.02.2012
Сообщений: 212

Я вижу 2 решения проблемы:
1) Заведите переменную (Скажем is_animated) которая будет меняться с true на false при старте анимации и её окончанию соответственно. код на клик будет выглядеть примерно так:
$(".right").click(function() {
					
      if(is_animated == false){
       slideLeft();
      }	
								});
	$(".left").click(function() {
	      if(is_animated == false){
       slideRight();
      }	
								});


2) Используйте метод stop(true,true), приводит анимацию к конечному значению.
Ответить с цитированием
  #3 (permalink)  
Старый 22.04.2013, 00:25
Новичок на форуме
Отправить личное сообщение для gogolinsky Посмотреть профиль Найти все сообщения от gogolinsky
 
Регистрация: 21.04.2013
Сообщений: 3

первый вариант пробовал - не работает.
Скрипт не обращает внимания на анимацию. Переменная принимает значение true еще до окончания всей анимации в функции.
Сейчас про Stop прочту, возможно оно
Ответить с цитированием
  #4 (permalink)  
Старый 22.04.2013, 10:25
Аватар для Tek
Tek Tek вне форума
Профессор
Отправить личное сообщение для Tek Посмотреть профиль Найти все сообщения от Tek
 
Регистрация: 22.02.2012
Сообщений: 212

Сообщение от gogolinsky Посмотреть сообщение
первый вариант пробовал - не работает.
Скрипт не обращает внимания на анимацию. Переменная принимает значение true еще до окончания всей анимации в функции.
Сейчас про Stop прочту, возможно оно
Вариант, работает просто вы что то не так делаете http://codepen.io/anon/pen/pLutv
Ответить с цитированием
  #5 (permalink)  
Старый 22.04.2013, 12:18
Новичок на форуме
Отправить личное сообщение для gogolinsky Посмотреть профиль Найти все сообщения от gogolinsky
 
Регистрация: 21.04.2013
Сообщений: 3

Все правильно. Первый вариант на самом деле работает.
var c=0;
function slideLeft() {
	if (c==0) {
		c=1;
		var aniSpeed = 800;
		$(".lastLast").addClass("noVisible").removeClass("lastLast");
		$(".last").animate({"left": "-1950px"},aniSpeed).addClass("lastLast").removeClass("last");			//Скрываем last
		$(".current").animate({"left": "-900px"},aniSpeed).addClass("last").removeClass("current");			//Сдвигаем current. Делаем его last
		$(".next").animate({"left": "150px"},aniSpeed).addClass("current").removeClass("next"); 				//Сдвигаем next, делаем его current
		$(".nextNext").animate({"left":"1200px"},aniSpeed,function(){c=0}).addClass("next").removeClass("nextNext"); 		//Сдвигаем класс nextNext. Делаем его next
		$(".next").eq(0).next(".psItem").removeClass("noVisible").addClass("nextNext").animate({"left":"2250px"},1); //Определяем элемент nextNext
			if(!($(".nextNext").length>0)) {
			$(".psItem").eq(0).addClass("nextNext").removeClass("noVisible").animate({"left": "2250px"},aniSpeed);
			}
	}
}

Дело было в том, что я переменную с обнулял в конце своей функции, а надо было в callback animate.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ожидание окончания ввода в поле input SiZE Events/DOM/Window 9 20.06.2017 10:20
Ajax. вывод результатов обработчика Alexander333 AJAX и COMET 4 29.12.2012 16:25
Как правильно подавить событие при подключении своего обработчика? Маэстро Firefox/Mozilla 2 03.09.2011 11:46
Проблема с вызовом функции в качестве обработчика G_M_S Общие вопросы Javascript 5 03.05.2011 11:55
[jQuery] [Обработка клика] Как не потерять текущий контекст внутри обработчика? xintrea Events/DOM/Window 1 10.02.2011 16:34