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

如何解决Polymer中iron-timer结合moment-js的hh:mm:ss计时不更新问题

解决iron-timer + moment.js 时间格式化不更新的问题

嘿,我懂你这会儿的困扰——计时器明明在走,但格式化后的时间却一动不动对吧?这大概率是因为你只在页面初始化时格式化了一次时间,没跟上iron-timer的更新节奏。咱们一步步来把它搞定:

核心问题:没绑定计时器的更新事件

iron-timer(应该是Polymer的那个组件吧?)在计时过程中,每秒会触发一次tick事件,或者当elapsedTime属性变化时会触发对应的属性变更事件。你需要在这些事件触发时,重新调用moment.js去格式化最新的计时时长,再同步更新到页面上。

具体解决方案示例

假设你的HTML结构是这样的:

<iron-timer id="myTimer" auto-start></iron-timer>
<p>当前计时:<span id="formattedTime"></span></p>

对应的JavaScript代码可以这么写:

// 获取DOM元素
const timer = document.getElementById('myTimer');
const timeDisplay = document.getElementById('formattedTime');

// 封装格式化函数,把毫秒转成hh:mm:ss格式
function formatElapsedTime(elapsedMs) {
  // 用moment的duration处理持续时间更准确,支持超过24小时的计时
  const duration = moment.duration(elapsedMs);
  // 补零确保每个时间单位都是两位数
  const hours = String(duration.hours()).padStart(2, '0');
  const minutes = String(duration.minutes()).padStart(2, '0');
  const seconds = String(duration.seconds()).padStart(2, '0');
  return `${hours}:${minutes}:${seconds}`;
}

// 初始化显示初始时间(比如00:00:00)
timeDisplay.textContent = formatElapsedTime(timer.elapsedTime);

// 监听tick事件,每秒更新一次显示内容
timer.addEventListener('tick', () => {
  timeDisplay.textContent = formatElapsedTime(timer.elapsedTime);
});

额外小提示

如果你不需要支持超过24小时的计时,也可以用更简洁的写法:

function formatElapsedTime(elapsedMs) {
  // 把毫秒数当成UTC时间戳处理,直接格式化
  return moment.utc(elapsedMs).format('HH:mm:ss');
}

这样写的原因是,咱们把初始化和动态更新的逻辑分开了:页面加载时先渲染一次初始时间,之后每秒钟跟着计时器的tick事件重新计算并更新显示,自然就能跟上计时器的节奏啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:37:06