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

求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:00:02