Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.04.2020, 19:54
MOT MOT вне форума
Аспирант
Отправить личное сообщение для MOT Посмотреть профиль Найти все сообщения от MOT
 
Регистрация: 30.08.2019
Сообщений: 52

Остановка таймера
Здравствуйте! Пишу мини-игру, хочу выяснить один вопрос, но для начала покажу код:
<!DOCTYPE html>
<html>
<head>
<style>
body {
font-family: cursive;
}
#stop {
display: none;
}
.square1, .square2 {
width: 100px;
height: 100px;
background: red;
position: fixed;
}
.square1 {
top: 100px;
animation: s1 linear infinite 7s;
z-index: 1;
}
.square2 {
top: 200px;
animation: s2 linear infinite 7s;
}
@keyframes s1 {
0% {
left: 0px;
}
50% {
left: calc( 100% - 100px );
}
100% {
left: 0px;
}
}
@keyframes s2 {
0% {
right: 0px;
}
50% {
right: calc( 100% - 100px );
}
100% {
right: 0px;
}
}
label {
border: 1px solid black;
border-radius: 3px;
}
.modalbox {
width: 300px;
height: 300px;
border: 1px solid black;
background: lightgrey;
z-index: 2;
position: fixed;
border-radius: 50px 50px 50px 50px / 10px 10px 10px 10px;
left: calc( 50% - 150px );
top: calc( 50% - 150px );
}
.ml {
width: 200px;
height: 40px;
text-align: center;
border: 1px solid black;
border-radius: 10px 10px 10px 10px / 30px 30px 30px 30px;
position: absolute;
left: calc( 50% - 100px );
top: calc( 50% - 20px );
}
#stop ~ .modalbox {
opacity: 0;
}
#stop:checked ~ .modalbox {
opacity: 1;
}
#stop ~ * {
animation-play-state: running;
transition: 0.5s;
}
#stop:checked ~ * {
animation-play-state: paused;
transition: 0.5s;
}
</style>
<script>
function init()
            {
                sec = 0;
                setInterval(tick, 1000);
            }
            
            function tick()
            {
                sec++;
                document.getElementById("timer").
                    childNodes[0].nodeValue = sec;
}
</script>
</head>
<body onload="init()">
<input type="checkbox" id="stop"><br>
<div class="timer_wrapper"><span id="timer">0</span> сек идёт игра</div>
<label for="stop">Стоп</label>
<div class="square1"></div>
<div class="square2"></div>
<div class="modalbox">
<label for="stop"><div class="ml">Продолжить игру</div></label>
</div>
<script>
document.getElementById("stop").checked = false;
</script>
</body>
</html>

Как видно, при нажатии на кнопку "Стоп" происходит остановка анимации блоков, но при этом таймер не останоавливается. Попытался прикрутить функцию типа if (stop.checked = true) {...}, но не прижилось. Не могли бы вы мне помочь остановить таймер? Вопрос простецкий, конечно, но реализовать не получилось

Последний раз редактировалось MOT, 19.04.2020 в 19:59.
Ответить с цитированием
  #2 (permalink)  
Старый 19.04.2020, 20:05
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

let timer = setInterval (fun, time) // Запустить таймер
clearInterval(timer) // Остановить таймер

А вообще setInterval (fun, time) - запускать функцию fun не раньше, чем через time ms. Может быть и позже. Поэтому отсчитывать по ней время не стоит. Со временем накопится ошибка.
Лучше так

let t0;
function init()
            {
                t0 = new Date().getTime();
                setInterval(tick, 1000);
            }
             
            function tick()
            {
                let sec = ((new Date().getTime() - t0)/1000 +0.5) | 0;
                document.getElementById("timer").
                    childNodes[0].nodeValue = sec;
}

Последний раз редактировалось voraa, 19.04.2020 в 20:18.
Ответить с цитированием
  #3 (permalink)  
Старый 19.04.2020, 20:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Сообщение от MOT
if (stop.checked = true) {...}, но не прижилось.
исправьте и сработает
Ответить с цитированием
  #4 (permalink)  
Старый 19.04.2020, 22:33
MOT MOT вне форума
Аспирант
Отправить личное сообщение для MOT Посмотреть профиль Найти все сообщения от MOT
 
Регистрация: 30.08.2019
Сообщений: 52

Исправил:
<!DOCTYPE html>
<html>
<head>
<script>
    function init()
            {
                sec = 0;
                setInterval(tick, 10);
            }
            
            function tick()
            {
                sec++;
                document.getElementById("timer").
                    childNodes[0].nodeValue = sec;
            }
function check() {
    if (document.getElementById('stop').checked) {
        clearInterval(timer);
    }
}
        </script>
</head>
<body onload="init()">
<input type="checkbox" id="stop"/><label for="stop" onclick="check()">Включить</label>
<div id="timer"></div>
</body>
</html>

Не работает с setInterval, даже если поставить тот же alert, всё "фурычит". В чём ошибка?
Ответить с цитированием
  #5 (permalink)  
Старый 19.04.2020, 22:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

MOT,
<!DOCTYPE html>
<html>
<head>
<style>
body {
font-family: cursive;
}
#stop {
display: none;
}
.square1, .square2 {
width: 100px;
height: 100px;
background: red;
position: fixed;
}
.square1 {
top: 100px;
animation: s1 linear infinite 7s;
z-index: 1;
}
.square2 {
top: 200px;
animation: s2 linear infinite 7s;
}
@keyframes s1 {
0% {
left: 0px;
}
50% {
left: calc( 100% - 100px );
}
100% {
left: 0px;
}
}
@keyframes s2 {
0% {
right: 0px;
}
50% {
right: calc( 100% - 100px );
}
100% {
right: 0px;
}
}
label {
border: 1px solid black;
border-radius: 3px;
}
.modalbox {
width: 300px;
height: 300px;
border: 1px solid black;
background: lightgrey;
z-index: 2;
position: fixed;
border-radius: 50px 50px 50px 50px / 10px 10px 10px 10px;
left: calc( 50% - 150px );
top: calc( 50% - 150px );
}
.ml {
width: 200px;
height: 40px;
text-align: center;
border: 1px solid black;
border-radius: 10px 10px 10px 10px / 30px 30px 30px 30px;
position: absolute;
left: calc( 50% - 100px );
top: calc( 50% - 20px );
}
#stop ~ .modalbox {
opacity: 0;
}
#stop:checked ~ .modalbox {
opacity: 1;
}
#stop ~ * {
animation-play-state: running;
transition: 0.5s;
}
#stop:checked ~ * {
animation-play-state: paused;
transition: 0.5s;
}
</style>
<script>
 function init()
 {
   sec = 0;
   setInterval(tick, 1000);
 }
 function tick()
 {
   if(document.getElementById("stop").checked) return;
   sec++;
   document.getElementById("timer").textContent = sec;
 }
</script>
</head>
<body onload="init()">
<input type="checkbox" id="stop"><br>
<div class="timer_wrapper"><span id="timer">0</span> сек идёт игра</div>
<label for="stop">Стоп</label>
<div class="square1"></div>
<div class="square2"></div>
<div class="modalbox">
<label for="stop"><div class="ml">Продолжить игру</div></label>
</div>
<script> document.getElementById("stop").checked = false;</script>
</body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 19.04.2020, 22:56
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,743

Сообщение от MOT Посмотреть сообщение
Не работает с setInterval, даже если поставить тот же alert, всё "фурычит". В чём ошибка?
Не внимательно посмотрели мой пост

<!DOCTYPE html>
<html>
<head>
<script>
   let timer;
    function init()
            {
                sec = 0;
                timer = setInterval(tick, 10);
            }
            
            function tick()
            {
                sec++;
                document.getElementById("timer").innerHTML = sec
            }
function check() {
    if (document.getElementById('stop').checked) {
        clearInterval(timer);
    }
}
        </script>
</head>
<body onload="init()">
<input type="checkbox" id="stop"/><label for="stop" onclick="check()">Включить</label>
<div id="timer"></div>
</body>
</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно внести изменения в скрипт таймера обратного отсчета времени? LADYX Элементы интерфейса 2 26.07.2016 22:25
Как сделать замену кода по истечению таймера? yted2 Общие вопросы Javascript 5 26.04.2016 17:54
продолжить работу таймера с помощью cookie dima1989 Элементы интерфейса 1 03.09.2015 09:37
Не работает сброс таймера (setTimeout и clearInterval) stankhat Events/DOM/Window 3 05.02.2015 16:55
запретить повторный запуск таймера setInterval-clearInterval mrWong Общие вопросы Javascript 1 01.02.2010 12:25