Не удается очистить интервал после установки?

Я создал слайд-шоу (function slide()): я хочу, чтобы эта функция запускалась при нажатии «воспроизведение» и приостанавливалась при нажатии «пауза». Я использовал setinterval он работает, только clearinterval отказывается работать, что я делаю не так?

<div id='play' onclick='play()'><img src='image1/fleche.png'></div>
<div id='pause' onclick='stop()'><img src='image1/break.png'></div>
function play(){
    var test = setInterval(slide,500);}
function stop(){
    clearInterval(test);}

person proefkip    schedule 22.08.2016    source источник
comment
test не должно быть определено в stop, я ожидаю ошибку в строгом режиме.   -  person ASDFGerte    schedule 22.08.2016
comment
Так? функция остановки(){clearInterval();}   -  person proefkip    schedule 22.08.2016
comment
Моя вторая проблема заключается в том, что если вы несколько раз нажмете на воспроизведение, слайд-шоу начнет глючить. Есть идеи?   -  person proefkip    schedule 22.08.2016
comment
используйте идентификаторы интервалов для управления событиями WindowTimers MDN   -  person EvilEpidemic    schedule 22.08.2016


Ответы (3)


Это потому, что «тест» не определен внутри функции остановки. Чтобы ваш код работал, вы можете сделать переменную «test» глобальной, например:

var test = null;

function play(){
    test = setInterval(slide,500);}
function stop(){
    clearInterval(test);}
person Rajat Sharma    schedule 22.08.2016
comment
хотя это загрязняет глобальную область видимости... - person Liam; 22.08.2016
comment
@proefkip, если у вас есть другой вопрос, задайте другой вопрос, пожалуйста, не задавайте несколько вопросов и особенно не задавайте вопросы в комментариях. - person Liam; 22.08.2016
comment
хорошо, это хороший совет - person proefkip; 22.08.2016
comment
@proefkip вы можете сделать что-то вроде этого (хотя код можно значительно улучшить): -- ` var test = null, isTimerOn = false; function play () { if (! isTimerOn) { test = setInterval (слайд, 500); } isTimerOn = истина; } функция stop(){ clearInterval(test); isTimerOn = ложь; } function slide(){ isTimerOn = false; // Ниже приведен код для фактического скольжения. } ` - person Rajat Sharma; 22.08.2016
comment
у меня такая же проблема. когда я нажимаю на воспроизведение, мое слайд-шоу становится грязным - person proefkip; 22.08.2016
comment
@proefkip, можешь поделиться скриптом JS? - person Rajat Sharma; 22.08.2016
comment
jsfiddle.net/a9bfedu7 - person proefkip; 22.08.2016

это классический вариант использования шаблона раскрывающегося модуля:

var mySlideShow = (function () {
    var intervalHolder;

    //this is private to the closure
    var slide = function(){
          //whatever slide does?
    }

    function play(){
      intervalHolder = setInterval(slide,500);
    }

    function stop(){
           clearInterval(intervalHolder);
     }

    return{
      play:play,
      stop:stop
    };
})();

назовите это так:

<div id='play' onclick='mySlideShow.play()'><img src='image1/fleche.png'></div>
<div id='pause' onclick='mySlideShow.stop()'><img src='image1/break.png'></div>

Преимущества этого метода:

  • Не загрязняет глобальную область видимости переменными
  • #P4#
person Liam    schedule 22.08.2016
comment
Не знаю, почему ОП не принял ваш ответ. - person Gerardo Furtado; 22.08.2016
comment
Не совсем быстрое решение. Но это лучший способ. Если другие решат его проблему, то хорошо для него :) - person Liam; 22.08.2016

Ваша проблема в том, что test — это переменная, объявленная внутри play(), и она существует только внутри этой функции. Вы должны объявить это снаружи:

var test;
function play(){
    test = setInterval(function(){
	console.log("hello")
	},500);
}
function stop(){
    clearInterval(test);
}
<button onclick="play()">play</button>
<button onclick="stop()">stop</button>

person Gerardo Furtado    schedule 22.08.2016
comment
Конечно, лучший способ сказать спасибо - это проголосовать... @proefkip. Вероятно, неплохо было бы ознакомиться с справочным центром. - person Liam; 22.08.2016
comment
это первый день, когда я использую этот сайт, я нажал на отмеченное и поставил ответ, который лучше всего мне помог, вверху - person proefkip; 22.08.2016