Это работает для меня, но правильный ли способ создать этот таймер?
Я могу быть наивным в этом отношении, но я думаю, что это близко к идеалу в чистом JS.
В чем будут недостатки использования этого таймера по сравнению с его созданием другим способом?
- Нажмите «Пуск», и таймер начнет обратный отсчет.
- Нажмите «Сброс», и таймер вернется к начальному времени.
HTML:
<button onclick='startStopTimer()'>Start</button>
<button onclick='startStopTimer()'>Reset</button>
<h1>00:10</h1>
JavaScript:
console.clear()
let timer = document.querySelector('h1')
let startingTime = 9
let startTimer;
let startStopTimer = () => {
if(startTimer){
clearInterval(startTimer);
timer.innerHTML = '00:10'
startingTime = 9
return startTimer = undefined
}else{
return startTimer = setInterval(()=>{
timer.innerHTML = `00:0${startingTime--}`
}, 1000)
}
}
2 ответа
HTML
- Встроенный
onClickобработчик событий, прикрепленный к вашему элементу HTML, вероятно, работает нормально; однако есть более эффективные способы обработки событий в чистом JS. В следующий раз добавьте обработчики событий в файл JS следующим образом:element.addEventListener('click', callbackName). h1это заголовок. Я бы не стал помещать значение таймера в этот конкретный тег. я думаю чтоspanздесь будет лучше по семантическим правилам HTML.
JavaScript
- Некоторые из ваших
letпеременные на основе могут быть изменены наconst. Идея состоит в том, чтобы использоватьconstвсякий раз, когда это возможно. Если это не так, только тогда используйтеlet. innerHTMLэто опасный метод. Его можно использовать для выполнения XSS-атак. Старайтесь избегать отображения текста на вашем сайте.
Из небольшого обзора;
- Ты используешь
9дважды, это должно быть присвоено хорошо названной глобальной константе - Вы жестко кодируете оба
9и00:10, это не гибко. Я ожидал, что смогу изменить9к99и чтобы таймер запускался в01:40 - По аналогии,
00:0${startingTime--}не допускает большой гибкости в сценарии - Браузер пытается в честь
1000, но этому нельзя доверять. Вы должны отслеживать исходное начало и вычитать его из текущего времени, чтобы определить, сколько времени прошло. В противном случае таймер ненадежен. - Размещение таймера в
h1элемент, вероятно, не является хорошей идеей семантически - Весь ваш код должен быть в хорошо названной (самоисполняющейся) функции
- Я не уверен, почему вы возвращаете что-нибудь в
startStopTimer? Если вы никогда не используете возвращаемое значение, просто отбросьтеreturnключевое слово - поскольку
clearIntervalвозвращаетсяundefinedи поскольку это имеет смысл, я бы выбралstartTimer = clearInterval(startTimer); - Почему
console.clear()? В производственном коде следует избегатьconsole
