求助:JavaScript自动打铃脚本仅触发一次问题排查
问题分析
原代码的核心问题是每次定时器触发都会强制让index自增,不管当前时间是否匹配数组中的目标时间。这会导致index快速遍历整个数组,只有第一次刚好时间与index=0对应的目标时间重合时才会触发提示,后续index已经指向其他时间点,而当前时间还没到,自然不会再触发。
修正方案
下面提供两种可行的修正方式,适配不同的需求场景:
方式一:无顺序依赖,匹配即触发
这种方式不关心打铃顺序,只要当前时间在预设列表里就触发提示:
function start_bell(){ var bell_schedule = ['18:52:00','18:53:00','18:54:00','18:55:00','18:56:00']; window.setInterval(function(){ var d = new Date(); var s = d.getSeconds(); var m = d.getMinutes(); var h = d.getHours(); var realtime = ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2) + ":" + ("0" + s).substr(-2); // 直接检查当前时间是否在打铃列表内 if(bell_schedule.includes(realtime)){ alert('play'); }else{ console.log('pause'); } }, 1000); }
方式二:严格按顺序触发
如果需要按照数组里的时间顺序依次触发,只有前一个时间点触发后才等待下一个,可修改为:
function start_bell(){ var bell_schedule = ['18:52:00','18:53:00','18:54:00','18:55:00','18:56:00']; var index = 0; window.setInterval(function(){ var d = new Date(); var s = d.getSeconds(); var m = d.getMinutes(); var h = d.getHours(); var realtime = ("0" + h).substr(-2) + ":" + ("0" + m).substr(-2) + ":" + ("0" + s).substr(-2); if(bell_schedule[index] === realtime){ alert('play'); // 仅在匹配成功时推进index,完成一轮后重置 index++; if(index >= bell_schedule.length){ index = 0; } }else{ console.log('pause'); } }, 1000); }
关键改动说明
- 方式一:用
Array.includes()简化判断逻辑,适合不需要严格顺序的场景。 - 方式二:将
index++的逻辑移至匹配成功的分支内,确保只有命中当前目标时间后,才会切换到下一个时间点,避免index无意义的快速递增。
内容的提问来源于stack exchange,提问作者Yudi
相关产品推荐
相关产品推荐

