2017-01-27 12 views
0

Я пытаюсь создать слайдер flex по примеру w3schools.Сброс таймера для слайдера flex при нажатии

Автоматическое скольжение и новый слайд по щелчку работает как charme, но я не могу заставить свою голову обмотать, как сбросить таймер каждый раз, когда я нажимаю на кнопки.

Да, у меня почти нет опыта работы с jquery/javascript, и я протестировал resetTimer(), t.reset() и многое другое в любом месте, которое я мог бы как-то понять. Было бы супер рад, если бы кто-то мог помочь мне здесь.

Благодаря Sam0, я уже отредактированный код - где-то еще что-то не так:

<script type="text/javascript"> 

var slideIndex = 0; 
carousel(); 

var repeater; 

function carousel() { 
var i; 
var x = document.getElementsByClassName("mySlides"); 
for (i = 0; i < x.length; i++) { 
    x[i].style.display = "none"; 
} 
slideIndex++; 
if (slideIndex > x.length) {slideIndex = 1} 
x[slideIndex-1].style.display = "block"; 
} 

function cycle(){ 
setInterval(function(){ 
    carousel(); 
}, 5000); 
} 

cycle(); 

function cycle(r){ 

if (r){ // if r is true then clear and restart the timer 
    clearInterval(repeater); // clear the timer 
    repeater = setInterval(function(){ // start the timer 
    carousel(); 
    }, 5000); 
} else { 
    clearInterval(repeater); // clear and stop the timer if r isn't true 
} 
} 

cycle(true); 


var slideIndex = 1; 
showDivs(slideIndex); 

function plusDivs(n) { 
showDivs(slideIndex += n); 
} 

function currentDiv(n) { 
cycle(true); 
showDivs(slideIndex = n); 
} 

</script> 
+0

Ваш предыдущий сценарий имел функцию с именем 'showDivs', которая в настоящее время отсутствует и не может быть названо. Лучше не изменять ваши ответы таким образом, так как это затрудняет людей, которые могли иметь подобную проблему для отслеживания, плюс это создает разрыв. Вместо этого проследите за комментариями и, где возможно, используйте jsfiddle, чтобы проиллюстрировать проблему. – Sam0

ответ

1

Если удалить setTimeout( вызов из функции carousel() и заменить его setInterval(), это позволит вам назвать карусели на повторяющемся таймере.

function cycle(){ 
    setInterval(function(){ 
     carousel(); 
    }, 5000); 
} 

cycle(); 

Затем можно назначить setInterval() вызов частной переменной (который мы определяем ранее вне функции), можно затем использовать в качестве ручки для сброса и перезапуска таймера:

var repeater; 

function cycle(r){ 

    if (r){ // if r is true then clear and restart the timer 
     clearInterval(repeater); // clear the timer 
     repeater = setInterval(function(){ // start the timer 
     carousel(); 
     }, 5000); 
    } else { 
     clearInterval(repeater); // clear and stop the timer if r isn't true 
    } 
} 

cycle(true); 

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

function currentDiv(n) { 
    cycle(true); 
    showDivs(slideIndex = n); 
} 

UPDATE:

Большого фрагмента ниже с адаптированной версией Отредактированный код OP и код w3schools для возиться.

var i; 
 
    var slides = document.getElementsByClassName("mySlides"); 
 
    var dots = document.getElementsByClassName("dot"); 
 
    var slideIndex = -1; 
 
    var repeater; 
 

 
    function carousel() { 
 

 
    for (i = 0; i < slides.length; i++) { 
 
     slides[i].style.display = "none"; 
 
    } // cycle through and hide all the images 
 

 
    slideIndex++; 
 

 
    if (slideIndex > slides.length) { 
 
     slideIndex = 1; 
 
    } else if (slideIndex <= 0) { 
 
     slideIndex = slides.length; 
 
    } // what to do if slideIndex is too high or too low 
 

 
    slides[slideIndex - 1].style.display = "block"; 
 
    // show the relevant slide 
 
    } 
 

 
    function cycle(r) { 
 

 
    if (r) { // if r is true then clear and restart the timer 
 
     clearInterval(repeater); // clear the timer 
 
     repeater = setInterval(function() { // start the timer 
 
     carousel(); 
 
     }, 5000); 
 
    } else { 
 
     clearInterval(repeater); // clear and stop the timer if r isn't true 
 
    } 
 
    } 
 

 
    window.onload = function() { 
 
    carousel(); 
 
    }; // show the start image on load 
 

 
    carousel(); 
 
    cycle(true); 
 

 

 
    function plusDivs(n) { 
 
    cycle(true); 
 
    slideIndex += n - 1; 
 
    carousel(); 
 
    } 
 

 
    function currentDiv(n) { 
 
    cycle(true); 
 
    slideIndex = n - 1; 
 
    carousel(); 
 
    }
* { 
 
    box-sizing: border-box 
 
} 
 
body { 
 
    font-family: Verdana, sans-serif; 
 
    margin: 0 
 
} 
 
.mySlides { 
 
    display: none 
 
} 
 
/* Slideshow container */ 
 

 
.slideshow-container { 
 
    max-width: 1000px; 
 
    position: relative; 
 
    margin: auto; 
 
} 
 
/* Next & previous buttons */ 
 

 
.prev, 
 
.next { 
 
    cursor: pointer; 
 
    position: absolute; 
 
    top: 50%; 
 
    width: auto; 
 
    padding: 16px; 
 
    margin-top: -22px; 
 
    color: white; 
 
    font-weight: bold; 
 
    font-size: 18px; 
 
    transition: 0.6s ease; 
 
    border-radius: 0 3px 3px 0; 
 
} 
 
/* Position the "next button" to the right */ 
 

 
.next { 
 
    right: 0; 
 
    border-radius: 3px 0 0 3px; 
 
} 
 
/* On hover, add a black background color with a little bit see-through */ 
 

 
.prev:hover, 
 
.next:hover { 
 
    background-color: rgba(0, 0, 0, 0.8); 
 
} 
 
/* Caption text */ 
 

 
.text { 
 
    color: #f2f2f2; 
 
    font-size: 15px; 
 
    padding: 8px 12px; 
 
    position: absolute; 
 
    bottom: 8px; 
 
    width: 100%; 
 
    text-align: center; 
 
} 
 
/* Number text (1/3 etc) */ 
 

 
.numbertext { 
 
    color: #f2f2f2; 
 
    font-size: 12px; 
 
    padding: 8px 12px; 
 
    position: absolute; 
 
    top: 0; 
 
} 
 
/* The dots/bullets/indicators */ 
 

 
.dot { 
 
    cursor: pointer; 
 
    height: 13px; 
 
    width: 13px; 
 
    margin: 0 2px; 
 
    background-color: #bbb; 
 
    border-radius: 50%; 
 
    display: inline-block; 
 
    transition: background-color 0.6s ease; 
 
} 
 
.active, 
 
.dot:hover { 
 
    background-color: #717171; 
 
} 
 
/* Fading animation */ 
 

 
.fade { 
 
    -webkit-animation-name: fade; 
 
    -webkit-animation-duration: 1.5s; 
 
    animation-name: fade; 
 
    animation-duration: 1.5s; 
 
} 
 
@-webkit-keyframes fade { 
 
    from { 
 
    opacity: .4 
 
    } 
 
    to { 
 
    opacity: 1 
 
    } 
 
} 
 
@keyframes fade { 
 
    from { 
 
    opacity: .4 
 
    } 
 
    to { 
 
    opacity: 1 
 
    } 
 
} 
 
/* On smaller screens, decrease text size */ 
 

 
@media only screen and (max-width: 300px) { 
 
    .prev, 
 
    .next, 
 
    .text { 
 
    font-size: 11px 
 
    } 
 
}
<h2>Automatic Slideshow</h2> 
 
<p>Change image every 5 seconds:</p> 
 

 
<div class="slideshow-container"> 
 

 
    <div class="mySlides fade"> 
 
    <div class="numbertext">1/3</div> 
 
    <img src="http://www.w3schools.com/howto/img_nature_wide.jpg" style="width:100%"> 
 
    <div class="text">Caption Text</div> 
 
    </div> 
 

 
    <div class="mySlides fade"> 
 
    <div class="numbertext">2/3</div> 
 
    <img src="http://www.w3schools.com/howto/img_fjords_wide.jpg" style="width:100%"> 
 
    <div class="text">Caption Two</div> 
 
    </div> 
 

 
    <div class="mySlides fade"> 
 
    <div class="numbertext">3/3</div> 
 
    <img src="http://www.w3schools.com/howto/img_mountains_wide.jpg" style="width:100%"> 
 
    <div class="text">Caption Three</div> 
 
    </div> 
 
    <a class="prev" onclick="plusDivs(-1)">❮</a> 
 
    <a class="next" onclick="plusDivs(1)">❯</a> 
 
</div> 
 
<br> 
 

 
<div style="text-align:center"> 
 
    <span class="dot" onclick="currentDiv(1)"></span> 
 
    <span class="dot" onclick="currentDiv(2)"></span> 
 
    <span class="dot" onclick="currentDiv(3)"></span> 
 
</div>

+0

Спасибо Sam0, пожалуйста, прочитайте мой отредактированный OP выше. Думаю, я допустил некоторые ошибки в отношении кода, который вы представили. Он работает как раньше, но не перезагружается при нажатии. – Franky2207

+0

вот версия вашего обновленного кода, которая больше не нуждается в функции showDivs(). https://jsfiddle.net/manoeuvres/q1s6h4jL/ поиграйте с ним, чтобы посмотреть, как это работает. – Sam0

+0

Большое спасибо Sam0! Помог мне много и решил мою проблему. – Franky2207