时钟Span标签不更新:补0及0转12逻辑生效但页面无变化
问题分析与解决方案
我一眼就看出问题出在哪了——你把DOM更新和时间格式化的顺序搞反了!
你当前的代码是先把未处理的原始小时/分钟/秒直接赋值给对应的Span元素,之后才做补0、转12小时制的格式化处理。但这些处理后的变量值并没有重新同步到DOM里,所以虽然console.log能看到正确的格式化后数值,页面上的Span内容却还是最初的原始值,自然不会更新。
修正后的代码
function showTime(){ const date = new Date(); const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; // 第一步:先获取原始时间数据,不直接操作DOM let day = days[date.getDay()]; let h = date.getHours(); let m = date.getMinutes(); let s = date.getSeconds(); // 第二步:处理12小时制和补0逻辑 if(h === 0){ h = 12; } else if(h > 12){ h -= 12; } h = h < 10 ? `0${h}` : h; m = m < 10 ? `0${m}` : m; s = s < 10 ? `0${s}` : s; // 第三步:把格式化后的最终值更新到DOM元素 document.getElementById("day").innerHTML = day; document.getElementById("hour").innerHTML = h; document.getElementById("minute").innerHTML = m; document.getElementById("second").innerHTML = s; setTimeout(showTime, 1000); console.log(m); } showTime();
关键修改点说明
- 调整顺序:先获取原始值→做格式化处理→最后更新DOM,确保页面渲染的是处理后的正确值
- 优化条件判断:将
h > 12的判断改为else if,避免在h已经被转为12后还执行减12的操作,逻辑更严谨 - 简化字符串拼接:用ES6模板字符串
0${h}替代传统的"0"+h,代码更简洁易读
内容的提问来源于stack exchange,提问作者Lightning Resaba
相关产品推荐
相关产品推荐

