2016-05-09 7 views
0

Привет Я вызываю функцию при нажатии, когда функция autoswitch = true также вызывает setInterval и устанавливает значение autoswitch равным false, снова щелкая вызов clearInterval, который не работает.clearInterval не работает

Нужна помощь

$(document).ready(function() { 
    var speed = 500; 
    var autoswitch = true; 
    var autoswitch_speed = 4000; 

    //add active class 
    $('.slide').first().addClass('active'); 

    //hide slides 
    $('.slide').hide(); 

    //show first slide 
    $('.active').show(); 

    // Click next to show next slide 
    $('#next').click(function() { 
    nextSlide(); 
    }); 

    //Onclick go to prev slide 
    $('#prev').click(function() { 
    prevSlide(); 
    }); 

    //play auto slide show 
    $('#playBtn').click(function() { 
    if (autoswitch === true) { 
     var setIntr = setInterval(nextSlide, autoswitch_speed); 
     autoswitch = false; 
    } else { 
     clearInterval(setIntr); 
     autoswitch = true; 
    } 
    }); 

    // next slide function 
    function nextSlide() { 
    $('.active').removeClass('active').addClass('oldActive'); 

    if ($('.oldActive').is(':first-child')) { 
     $('.slide').last().addClass('active'); 
    } else { 
     $('.oldActive').prev().addClass('active'); 
    } 

    $('.oldActive').removeClass('oldActive'); 
    $('.slide').fadeOut(speed); 
    $('.active').fadeIn(speed); 
    } 

    // Prev slide function   
    function prevSlide() { 
    $('.active').removeClass('active').addClass('oldActive'); 

    if ($('.oldActive').is(':first-child')) { 
     $('.slide').last().addClass('active'); 
    } else { 
     $('.oldActive').prev().addClass('active'); 
    } 

    $('.oldActive').removeClass('oldActive'); 
    $('.slide').fadeOut(speed); 
    $('.active').fadeIn(speed); 
    } 
}); 
+1

'вар setIntr' является связанный оператором 'if'. Сделайте переменную public использовать ее в 'else'. – Bhumika107

+1

Я думаю, что он работает, если вы переместите 'setIntr' в глобальную область – se0kjun

+0

, потому что вы объявляете его в блоке' if', чтобы он не мог получить доступ в блоке 'else' \ – Gomzy

ответ

0

Это потому, что вы определяете setIntr в качестве локальной переменной к этой функции. Как только он выходит из области действия и вызывается снова, у вас больше нет дескриптора на этом интервале. Вы должны где-то определить var вне области. Я хотел бы сделать его глобальным, но я уверен, что может быть более эффективными способами

3

Вы должны объявить setIntr за пределы щелчка функции. Итак, вы можете установить его в верхней части функции.

Я пошел и фиксированный код здесь: https://snippetbox.xyz/9eb54a2a1f52dc1f5d40/

$(document).ready(function() { 
    var speed = 500; 
    var autoswitch = true; 
    var autoswitch_speed = 4000; 
    var setIntr; 

    //add active class 
    $('.slide').first().addClass('active'); 

    //hide slides 
    $('.slide').hide(); 

    //show first slide 
    $('.active').show(); 

    // Click next to show next slide 
    $('#next').click(function() { 
    nextSlide(); 
    }); 

    //Onclick go to prev slide 
    $('#prev').click(function() { 
    prevSlide(); 
    }); 

    //play auto slide show 
    $('#playBtn').click(function() { 
    if (autoswitch === true) { 
     setIntr = setInterval(nextSlide, autoswitch_speed); 
     autoswitch = false; 
    } else { 
     clearInterval(setIntr); 
     autoswitch = true; 
    } 
    }); 

    // next slide function 
    function nextSlide() { 
    $('.active').removeClass('active').addClass('oldActive'); 

    if ($('.oldActive').is(':first-child')) { 
     $('.slide').last().addClass('active'); 
    } else { 
     $('.oldActive').prev().addClass('active'); 
    } 

    $('.oldActive').removeClass('oldActive'); 
    $('.slide').fadeOut(speed); 
    $('.active').fadeIn(speed); 
    } 

    // Prev slide function   
    function prevSlide() { 
    $('.active').removeClass('active').addClass('oldActive'); 

    if ($('.oldActive').is(':first-child')) { 
     $('.slide').last().addClass('active'); 
    } else { 
     $('.oldActive').prev().addClass('active'); 
    } 

    $('.oldActive').removeClass('oldActive'); 
    $('.slide').fadeOut(speed); 
    $('.active').fadeIn(speed); 
    } 
}); 
-1

вам просто нужно добавить переменную «setIntr» из СТОРОНА, если условие, как, как показано ниже:

$('#playBtn').click(function() { 
    var setIntr; 
    if (autoswitch === true) { 
    setIntr = setInterval(nextSlide, autoswitch_speed); 
    autoswitch = false; 
    } else { 
    clearInterval(setIntr); 
    autoswitch = true; 
    } 
    }); 

Как вам объявили «setIntr» в условии If, которое не доступно в противном случае, поэтому, если вы хотите использовать его в другом месте, тогда вы должны объявить его стороной if или глобально.

EDITED: Вы пытаетесь установить значение в одном состоянии и проверить в другом месте. в этом случае вам необходимо объявить «setIntr» в качестве глобальной переменной.

поэтому рабочий код должен быть как следующее:

объявляют "setIntr" по всему миру в document.ready

затем используйте следующий код:

$('#playBtn').click(function() { 
if (autoswitch === true) { 
    setIntr = setInterval(nextSlide, autoswitch_speed); 
    autoswitch = false; 
} else { 
    clearInterval(setIntr); 
    autoswitch = true; 
} 
}); 
+0

Объяснение 'Как вы заявили« setIntr »в If Условие, которое не доступно в противном случае, неверно. 'var' объявляет переменные для всей функции. [MDN: var hoisting] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/var#var_hoisting) –

+0

@ t.niese, если вы проверите вопрос, вы получите то, что я рассказывая здесь. Я прошу проверить допрос, что он объявил varibale в том случае, если он согласен, и он пытается получить к нему доступ иначе. Это невозможно ... тогда я отправлю свой первый ответ. –

+0

Работал, Удивительно Спасибо много. – Spark

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