2016-02-04 2 views
0

У меня есть слайдер со стрелками. Когда я нажимаю на эти стрелки много раз, слайдер постоянно скользит в зависимости от того, сколько раз я нажимаю стрелку. Как вы не нажимаете на стрелку до тех пор, пока скользящая анимация не будет выполнена?Как предотвратить множественные нажатия на стрелки слайдера до тех пор, пока не будет выполнена анимация слайдера

Пожалуйста, смотрите, что я имею в виду моего пера здесь: http://codepen.io/gianaguilar/pen/JGaxKL

Попробуйте нажать на стрелки несколько раз и как ползунок отвечает. Мне нужно иметь возможность скользить по одному клику за раз.

Спасибо!

Вот код JQuery

var $visibleSlide, getDataSlide, sliderInterval, getDataNextSlide, getDataPrevSlide, getDataNavDot; 
var fadeDuration = 1000; 
var pause = 8000; 

//show first slide 
$('.slides li:first-child').css('display', 'block'); 

//show first nav dot 
$('.nav li:first-child').addClass('active-cd'); 

//find out what slide is visible and get its data attribute 
function getSlideInfo() { 
    $visibleSlide = $('.slides').find('li:visible'); 
    getDataSlide = $visibleSlide.data('n'); 
    getDataNextSlide = $visibleSlide.next().data('n'); 
    getDataPrevSlide = $visibleSlide.prev().data('n'); 
} 

//show next slide 
function showNextSlide() { 
    getSlideInfo(); 

    $('.nav li').removeClass('active-cd'); 

    if (getDataSlide < 3) { 
    $visibleSlide.fadeOut(fadeDuration); 
    $visibleSlide.next().fadeIn(fadeDuration); 
    $('.nav li[data-cd=' + getDataNextSlide + ']').addClass('active-cd'); 
    } else { 
    $visibleSlide.fadeOut(fadeDuration); 
    $('.slides li:first-child').fadeIn(fadeDuration); 
    $('.nav li:first-child').addClass('active-cd'); 
    } 
} //end showNextSlide 

function showPrevSlide() { 
    getSlideInfo(); 

    $('.nav li').removeClass('active-cd'); 

    if (getDataSlide > 1) { 
    $visibleSlide.fadeOut(fadeDuration); 
    $visibleSlide.prev().fadeIn(fadeDuration); 
    $('.nav li[data-cd=' + getDataPrevSlide + ']').addClass('active-cd'); 
    } else { 
    $visibleSlide.fadeOut(fadeDuration); 
    $('.slides li:last-child').fadeIn(fadeDuration); 
    $('.nav li:last-child').addClass('active-cd'); 
    } 

} // end showPrevSlide 

// controls 
$('.next').on('click', showNextSlide); 
$('.prev').on('click', showPrevSlide); 

//autoplay 
function startSlider() { 
    sliderInterval = setInterval(showNextSlide, pause) 
} 
startSlider(); 
$('.slideshow').mouseenter(function() { 
    clearInterval(sliderInterval); 
}); 
$('.slideshow').mouseleave(startSlider); 

//control dots clicks 
$('.nav li').on('click', function() { 
    getDataNavDot = $(this).data('cd'); 
    getSlideInfo(); 

    $('.nav li').removeClass('active-cd'); 
    $(this).addClass('active-cd'); 

    $visibleSlide.fadeOut(fadeDuration); 
    $('.slides li[data-n=' + getDataNavDot + ']').fadeIn(fadeDuration); 
}); //end dots click 
+0

взгляд в .is (': анимированные') - https://api.jquery.com/animated-selector/ - и .stop() - https: //api.jquery .com/stop/- в основном сообщите о своем пред и о возврате, если слайды заняты. –

+0

Одним из способов было бы отключить событие click за определенное количество времени, чтобы дать время анимации до того, как пользователю будет разрешено щелкнуть еще раз. [См. Это сообщение SO] (http://stackoverflow.com/questions/32002366/javascript-disable-the-click-event-for-1-second-after-an-id-is-clicked) – crazymatt

ответ

0

Вы можете определить переменную isAnimating, которая устанавливается в true, когда вы находитесь в следующей или предыдущей функции слайд, и установить в false когда анимация завершена (в пределах функция обратного вызова к одной из ваших функций затухания).

Простая проверка в верхней части этих следующих и предыдущих функций для возврата false, если для функции isAnimating установлено значение true, это предотвратит ожидание анимации.

Смотрите здесь: http://codepen.io/anon/pen/XXPOQY

+0

Удивительный! Спасибо большое! –

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