【发布时间】:2021-01-08 18:08:06
【问题描述】:
我从各种来源创建了我能找到的最简单的 js 计数器。如何为每个计数器设置不同的 setTimeout,以便它们同时结束?
更新:我已将下面的正确答案最小化,这是最终代码:
const counters = document.querySelectorAll('.counter');
const duration = 2000; // Finish in 2 seconds
const speed = 2000;
const state = {};
const max = Math.max(...[...counters]
.map(counter => +counter.dataset.target));
const tick = duration / max;
const updateCount = (counter) => {
const target = +counter.dataset.target;
const value = +counter.dataset.value;
const ratio = target / max;
const ms = Math.ceil(ratio * tick);
const incr = target / speed;
const newVal = value + incr;
if (value < target) {
counter.innerText = Math.floor(newVal);
counter.dataset.value = newVal;
setTimeout(updateCount, ms, counter);
} else {
counter.innerText = target;
counter.dataset.value = target;
}
};
counters.forEach(updateCount);
<div class="counter" data-key="1" data-value="0" data-target="1000">0</div>
<div class="counter" data-key="2" data-value="0" data-target="2000">0</div>
【问题讨论】:
-
你不能让两个定时器同时结束,因为 JavaScript 是同步运行的。
-
如果它们以毫秒为单位的速率不同,那么它们永远不会同时结束。
-
如果我为每个 div 使用 id 会怎样?
标签: javascript html counter settimeout