#javascript #html #dom
Вопрос:
У меня есть простая веб-страница счетчика, на которой есть кнопка » 1″ и дисплей подсчета. Когда вы нажимаете на кнопку, количество просмотров на веб-странице увеличивается на 1. Когда количество достигнет 5, на странице должно появиться предупреждение и сбросить счетчик до 0.
Однако, когда счетчик достигает 5, на веб-странице по-прежнему отображается «Количество:4» и появляется предупреждение. Более того, внутренний текст тега уже стал «Количество:5». Так почему же существует несоответствие между HTML и реальной веб-страницей? Имеет ли это какое-либо отношение к асинхронным операциям?
Я мог бы добавить setTimeout(function(){alert("Counter value: " totalCount)},1000);
«а», чтобы отложить оповещение. Но это не было моим первоначальным намерением. Предупреждение всегда должно появляться сразу после того, как счетчик наберет 5 и отобразится как «Количество:5».
let totalCount = 0;
function onload() {
document.getElementById("increment").addEventListener("click", onClick);
renderCounter();
}
function onClick() {
totalCount ;
renderCounter();
if (totalCount > 4) {
alert("Counter value: " totalCount);
totalCount = 0;
renderCounter();
}
}
function renderCounter() {
let counts = document.getElementById("counter");
counts.innerText = "Counts: " totalCount;
}
<body onload="onload()">
<header id="header">
<h1>Interesting tests</h1>
</header>
<section class="my-counter">
<p id="counter"></p>
</section>
<section id="increment-button">
<button type="button" id="increment"> 1 </button>
</section>
<script src="increment.js"></script>
Комментарии:
1. Вы сбрасываете
totalCount
настройки перед тем, как визуализировать их сrenderCounter()
помощью . Простое удалениеrenderCounter()
в условном блоке должно это исправить.2. Да, это верно. Потому что функция renderCounter() всегда вызывается в функции onClick (). Предполагается, что он будет отображать 0, если totalCount > 4. Правка: чтобы уточнить, что функция renderCounter() после сброса totalCount предназначена специально. Это заставит веб-страницу отображать «Количество:0».
Ответ №1:
Вам действительно нужен параметр setTimeout, но он не должен составлять 1 секунду
- Не сбрасывайте перед рендерингом
- предупреждение блокируется, поэтому интерфейс не получает возможности обновиться
- Разрешить рендеринг, затем предупредить, затем снова выполнить рендеринг
- Используйте EventListener вместо встроенных обработчиков событий
let totalCount = 0;
window.addEventListener("load", function() {
document.getElementById("increment").addEventListener("click", onClick);
renderCounter();
})
function onClick() {
totalCount ;
renderCounter();
if (totalCount > 4) {
totalCount = 0;
setTimeout(function() {
alert("Counter value: " totalCount);
renderCounter();
}, 10); // allow the interface to update
}
}
function renderCounter() {
let counts = document.getElementById("counter");
counts.innerText = "Counts: " totalCount;
}
<header id="header">
<h1>Interesting tests</h1>
</header>
<section class="my-counter">
<p id="counter"></p>
</section>
<section id="increment-button">
<button type="button" id="increment"> 1 </button>
</section>
<script src="increment.js"></script>