Кнопка паузы для слайд-шоу Javascript

#javascript #html

#javascript #HTML

Вопрос:

Я пытаюсь создать кнопку паузы для слайд-шоу JavaScript, которая представляет собой бесконечный цикл, отображающий случайные изображения. Консоль ошибок не выдает никаких ошибок. Слайд-шоу запускается, но значение кнопки не становится паузой (я играл с этим, и раньше так и было). Если вы нажмете кнопку дважды, слайд-шоу ускорится. Ответ, вероятно, лежит в пределах clearTimeout (t); где-то, но, похоже, я не могу заставить это работать. Вот сценарий:

 <script type="text/javascript">
var t;
function letsslide(){
     var switcha = document.getElementById("SlideShow");
     if (switcha.getAttribute("value").length == 9) {
           switcha.setAttribute("value", "Pause");
           keeprollin();
     }
     if (switcha.getAttribute("value").length == 5) {
           t = "stopped";
           switcha.setAttribute("value", "Slideshow");
     }
}
function keeprollin(){
     var t = setTimeout("magic()", 2000);
}
function magic(){
     var dazp = Math.ceil(Math.random() * 35);
     document.getElementById('bigpic').setAttribute("src", "images/"   dazp   ".jpg");
     keeprollin();
}
</script>
  

Вот HTML:

 <img src="images/9.jpg" id="bigpic" />
<input type="submit" id="SlideShow" value="Slideshow" onclick="letsslide()" />
  

Спасибо!

Ответ №1:

Несколько проблем:

Во-первых, всякий раз, когда вы вызываете keeprollin() , запускается цикл. Цикл продолжается

 keeprollin()
magic()
keeprollin()
margin()
...infinite
  

Вы никогда не остановите эту цепочку, как только она начнется. У вас была правильная идея, установив var t в качестве значения, возвращаемого с помощью setTimeout , но установка t значения «остановлено» не останавливает этот цикл. Вам нужно использовать clearTimeout(t) , чтобы остановить цикл.

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

В-третьих, не используйте длину строки, чтобы определить, что вы хотите сделать, просто сравните строки. switcha.getAttribute("value").length==9 должно быть switcha.getAttribute("value") == 'Slideshow'

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

… закончил разглагольствовать 🙂

Комментарии:

1. Кажется, есть еще одна проблема: (Спасибо за ваш совет; Я постараюсь придумать названия получше 🙂

Ответ №2:

 (function() {
    var t;

    function letsslide() {
        var switcha = document.getElementById("SlideShow");
        if (switcha.value === "Slideshow") {
            switcha.value = "Pause";
            t = setTimeout(magic, 2000);
        }
        if (switcha.value === "Pause") {
            switcha.value = "Slideshow";
            clearTimeout(t);
        }
    }

    window.letsslide = letsslide;

    function magic() {
        var dazp = Math.ceil(Math.random() * 35);
        document.getElementById('bigpic').src = "images/"   dazp   ".jpg";
        t = setTimeout(magic, 2000);
    }

})();
  

Переработано так, чтобы оно работало. Добавлено закрытие, поэтому t оно больше не является глобальным.

Ответ №3:

 var t;
function startSlideshow() {
     t = setInterval(magic, 2000);
}
function letsslide(){
     var switcha = document.getElementById("SlideShow");
     if (switcha.getAttribute("value").length == 9) {
           startSlideshow();
           switcha.setAttribute("value", "Pause");
     }
     if (switcha.getAttribute("value").length == 5) {
           clearTimeout(t);
           switcha.value = "Slideshow";
     }
}
function magic(){
     var dazp = Math.ceil(Math.random() * 35);
     document.getElementById('bigpic').setAttribute("src", "images/"   dazp   ".jpg");
}
  

Вероятно, это больше то, что вы хотите.

Комментарии:

1. Хорошо, теперь я многое изменил — работает ли обновленный код лучше для вас?

2. Нет, это не работает. Я попытался настроить несколько вещей, и это все равно не сработает. С меня хватит на сегодня. Большое спасибо за вашу помощь 🙂