坠向深空 2022-07-01 09:20 采纳率: 100%
浏览 60
已结题

定时器setInterval里可以调用自己clear掉吗?

如何在定时器setInterval 里,将自己作为参数调用?然后再方法里clear掉?
我想用 js 制作一个显示下班时间的页面。

做法:
1、我将下班时间分开 上午and下午
2、然后定义一个倒计时函数,将下班时间作为参数传递,计算
3、最后定义了两个定时器,调用函数算计

问题:
我想在方法里,满足 if 后停止定时器。
我试过在参数列里调用它自己,好像不行?

像图里手动的话,只能clear掉一个,要么两个一起clear掉。
怎么可以让它在方法里自己clear自己?
兄嘚们咋办啊?

代码:

img


效果图:

img

  • 写回答

1条回答 默认 最新

  • a5156520 2022-07-01 09:29
    关注

    是上午自动开启上午的计时器,下午自动开启下午的计时器,到点就结束吗?
    加个时间判断,如果是上午下班时间到了结束就关闭上午的定时器,如果是下午下班时间到了就关闭下午的定时器。


    更新:
    你是说上午的定时器完成后,清除定时器和下班的提示吗?
    下面是我的一个简单的实现,供参考:
    参考链接:
    JS实现倒计时功能

    
    
    <html>
        
        <p id="morning" ></p>
        <p id="message"> </p>
        
        <p id="allday"></p>
    
    </html>
    <script>
        
        var middle = new Date();
        middle.setHours(12);
        middle.setMinutes(00);
        middle.setSeconds(00);
        
        var overtime = new Date();
        overtime.setHours(17);
        overtime.setMinutes(30);
        overtime.setSeconds(00);
        
        var midday = document.getElementById("morning");
        midday.innerHTML = "Morning:";
        var allday = document.getElementById("allday");
        allday.innerHTML="Afternoon:";
        
        function AfterWork(time,container){
        
            var now = new Date();
            var d3 = time.getTime()-now.getTime();
            
            
            <!-- 
            http://c.biancheng.net/view/5798.html
            -->
            hh = Math.floor(d3/(1000*60*60)%24),  //计算小时数
            mm = Math.floor(d3/(1000*60)%60),  //计算分钟数
            ss = Math.floor(d3/1000%60);  //计算秒数
            
            if(ss<0){
                
                container.innerHTML ="下班啦!";
                if(container==document.getElementById("morning")){
                    container.innerHTML="";
                    clearInterval(set1);
                    
                }else if(document.getElementById("allday")){
                    
                    clearInterval(set2);
                }
                
            }else{
                
                container.innerHTML ="";    
                if(container==document.getElementById("morning")){
                    container.innerHTML += "morning:";
                }else if(document.getElementById("allday")){
                    container.innerHTML += "allday:";
                }
                container.innerHTML += hh+':'+mm+':'+ss;
            }
        
        }
        
        var set1 = setInterval(AfterWork,1000,middle,midday);
        var set2 = setInterval(AfterWork,1000,overtime,allday);
        
    </script>
    

    img

    img

    img

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    坠向深空 2022-07-04 00:49

    用条件语句,分别关闭定时器ok。
    但是,不能在函数中把定时器当做参数调用吗?

    回复
    坠向深空 2022-07-05 08:20

    不是。
    我说的是能不能在函数里添加一个虚参数,在定时器里把自己作为实际参数传递
    不用判断上下午,直接满足时间差为负值时,调用这个参数。
    这样就能少写一个判断了。
    而且如果有多个定时器的话,岂不是要写很多个判断?

    回复
    a5156520 回复 坠向深空 2022-07-05 08:58

    不知道这个满足你的要求不?

    
    
    
    <html>
        
        <p id="morning" ></p>
        <p id="message"> </p>
        
        <p id="allday"></p>
    
    </html>
    <script>
        
        var middle = new Date();
        middle.setHours(16);
        middle.setMinutes(58);
        middle.setSeconds(00);
        
        var overtime = new Date();
        overtime.setHours(16);
        overtime.setMinutes(59);
        overtime.setSeconds(00);
        
        var midday = document.getElementById("morning");
        midday.innerHTML = "Morning:";
        var allday = document.getElementById("allday");
        allday.innerHTML="Afternoon:";
        
        function AfterWork(time,str,container,set){
        
            var now = new Date();
            var d3 = time.getTime()-now.getTime();
            
            
            <!-- 
            http://c.biancheng.net/view/5798.html
            -->
            hh = Math.floor(d3/(1000*60*60)%24),  //计算小时数
            mm = Math.floor(d3/(1000*60)%60),  //计算分钟数
            ss = Math.floor(d3/1000%60);  //计算秒数
            
            if(ss<0){
                
                container.innerHTML =str+"下班啦!"
                
                clearInterval(set);
            }else{
                
                container.innerHTML ="";    
                
                container.innerHTML =str+ hh+':'+mm+':'+ss;
            }
        
        }
        
        var set1 = setInterval(AfterWork,1000,middle,"Morning:",midday,this);
        var set2 = setInterval(AfterWork,1000,overtime,"Afternoon:",allday, this);
        
    </script>
    

    img

    1
    回复
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 7月19日
  • 已采纳回答 7月12日
  • 创建了问题 7月1日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部