Моя функция setTimeout () работает, но моя clearTimeout () не работает. Даже если у меня есть оператор if, который должен запускать функцию clearTimeout, когда моя переменная «secs» меньше 0, таймер продолжает обратный отсчет до отрицательных чисел. Когда я набираю имя моей переменной ‘secs’ в консоли, я получаю неопределенное значение, даже если оно определено как параметр в функции, вызываемой моим setTimeout. Я не знаю, что я делаю не так. Может кто-нибудь помочь, пожалуйста?

Мой полный код по адресу https://codepen.io/Rburrage/pen/qBEjXmx ;

Вот фрагмент кода JavaScript:

function startTimer(secs, elem) { t = $(elem); t.innerHTML = "00:"   secs; if(secs{amp}lt;0) { clearTimeout(countDown); } secs--; //recurring function countDown = setTimeout('startTimer(' secs ',"' elem '")', 1000); } 

Добавьте условие для вызова рекурсивной функции, как показано ниже.

 if (secs {amp}lt; 0) { secs = secsInput; } //recurring function countDown = setTimeout('startTimer(' secs ',"' elem '")', 1000); 

Для таймера обратного отсчета я бы рекомендовал вместо этого использовать setInterval и clearInterval . setInterval будет неоднократно запускать функцию обратного вызова для вас. Это может выглядеть так:

 let countdown; function startTimer(secs, elem) { countdown = setInterval(function(){ t = $(elem); t.innerHTML = "00:"   secs; secs-- if (secs {amp}lt; 0) { clearInterval(countdown); } }, 1000); } 

К тому времени, когда вы вызываете clearTimeout(countDown) , countDown ссылается на предыдущий тайм-аут, который уже countDown . Это не остановит того, кто еще не начал. Вы можете просто не переустанавливать тайм-аут, как

  if(!/*finished*/) setTimeout(startTimer, 1000, secs, elem); 

В вашем случае удобнее использовать setInterval и clearInterval .

Чтобы сохранить функции setTimeout и clearTimeout , вы должны добавить return в операторе if.

 function startTimer(secs, elem) { t = $(elem); t.innerHTML = "00:"   secs; if(secs{amp}lt;0) { clearTimeout(countDown); return; } secs--; //recurring function countDown = setTimeout('startTimer(' secs ',"' elem '")', 1000); } 

На мой взгляд, есть 4 события, которые должны быть обработаны таймером:

  1. Викторина начинается
  2. Викторина заканчивается
  3. Таймер заканчивается
  4. Игрок отвечает на вопрос

Это можно решить с помощью функции, возвращающей объект с некоторыми опциями. CreateTimer может использоваться для установки параметров таймера.

Пункт 1. будет timer.start () -{amp}gt; запустит таймер с параметрами

Точка 3. может быть решена с помощью обратного вызова, который будет вызван, если таймер закончится -{amp}gt; createTimer(5,'display', ()={amp}gt;{ // your code goes here })

Точка 2. может быть достигнута с помощью -{amp}gt; timer.stop ()

Пункт 4. необходим, когда таймер должен быть сброшен без истечения времени timer.reset ()

В дальнейшем интервал не входит в глобальную область, поэтому вы можете использовать несколько таймеров с разными настройками, и они не будут мешать друг другу.

 // function for creating the timer function createTimer(seconds, cssSelector, callbackOnTimeout) { // interval the timer is running let interval; // the html node where innerText will be set const display = document.getElementById(cssSelector) // original seconds passt to createTimer needed for restart const initSec = seconds // starting or continuing the interval function start() { // setting interval to the active interval interval = setInterval(() ={amp}gt; { display.innerText = `00:${seconds}`; --seconds; if (seconds {amp}lt; 0) { // calling restart and callback to restart callbackOnTimeout() restart() } }, 1000); } // just stopping but not resetting so calling start will continue the timer // player takes a break function stop(){ clearInterval(interval) } // opted for a restart and not only a reset since it seemed more appropriate for your problem function restart(){ clearInterval(interval) seconds = initSec start() } // returning the object with the functions return { start: start, stop: stop, restart: restart } } // example for creating a timer const timer1 = createTimer(5,'display',()={amp}gt;{ console.log(`you where to slow ohhh...`) }) // calling the timer timer1.start() 
FUBAR

новый участник этого сайта. Будьте внимательны, спрашивая разъяснения, комментируя и отвечая. Проверьте наш

Правила поведения

,