You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS计数器[data-speed]属性无法实现差异化计数速度问题求助

问题根源
  • 计数变量i为全局作用域变量,所有计数器的定时器共享修改同一个i,导致所有计数器数值同步,终止判断逻辑紊乱
  • finalNumber未做类型转换,读取的是字符串类型的innerText,数值比较存在隐式转换隐患
  • 未限制回调重复触发,元素多次进出视口会重复创建定时器,导致计数逻辑异常
修复实现

修改后的JS代码

const counters = document.querySelectorAll('.counter');

const io = new IntersectionObserver(entries => {
  entries.forEach(entry => {
    const finalNumber = Number(entry.target.innerText);
    const speed = Number(entry.target.dataset.speed);

    if (entry.isIntersecting) {
      // 每个计数器独立维护计数变量
      let count = 0;
      entry.target.innerText = count;

      const interval = setInterval(() => {
        count += speed;
        if (count >= finalNumber) {
          entry.target.innerText = finalNumber;
          clearInterval(interval);
          // 计数完成后取消监听,避免重复触发
          io.unobserve(entry.target);
        } else {
          entry.target.innerText = count;
        }
      }, 10);
    }
  });
});

counters.forEach(item => io.observe(item));

HTML代码无需调整,和原有逻辑保持一致即可

<h1 class="counter" data-speed="1">1000</h1>
<h1 class="counter" data-speed="2">1000</h1>
<h1 class="counter" data-speed="3">1000</h1>
<h1 class="counter" data-speed="4">1000</h1>
<h1 class="counter" data-speed="5">1000</h1>

内容的提问来源于stack exchange,提问作者AntunCrnja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:54:04