setInterval定时器设定开关

本文介绍了一个使用JavaScript实现的简单案例,通过设置定时器使页面上的DIV元素按指定像素移动,并在达到特定位置时停止。

今天简单写一个小案例:点击按钮,让div“走”起来。主要是为了说明给定时器设定开关时需要注意的几个问题。需求是:当点击按钮,让div向右一直移动,当移动到500像素时,停下来。好了那么简单的布局代码看一下:

css代码
<style>
#box{width:50px;height:50px;background:#ff6b0e;position: absolute;top:50px;left:50px;}
</style>
html代码
<body>
<input id="btn" type="button" value="按钮"/>
<div id="box"></div>
</body>

那么简单的js效果是这样的:

<script>
    //兼容不同浏览器获取行间样式
    function getStyle ( obj, attr ) {
        return obj.currentStyle?obj.currentStyle[attr] : getComputedStyle( obj )[attr];
    }

    window.onload=function(){
        var aBtn=document.getElementById("btn");
        var oBox=document.getElementById("box");
        var timer=null;
        aBtn.onclick=function(){
            clearInterval(timer);//这里先要清除一下定时器是为了防止一直点击按钮,div一直加速

            //开启定时器,假定让其等于500的时候,停止下来
            timer=setInterval(function(){
                var speed=parseInt(getStyle(oBox,"left"))+18;

                if( speed > 500){//所以这里一定要让其要大于500的时候等于500,这样的话在给div赋值
                    speed = 500
                }

                oBox.style.left= speed +"px";

                //这里不能是大于500,否则有可能结果是508停下了,就不是要求的500
                if( speed == 500){
                    clearInterval(timer)
                }

            },50)

            };


    };
</script>

这里需要注意的几个问题是:

第一,就是获取div的样式一定要用到getStyle,而它存在一定兼容性,其解决方案上面案例有写到,这是通用的简单写法;

第二,就是若是让div在等于一定值的情况下停下来的话,一定要想清楚它移动的单位长度能否被这个值除尽,若不能,那么就要先判断当其大于这个值的时候要它先等于设定的这个值,然后再去赋值,给加条件让其停止。

好了,上面的例子备注也很清楚了,当然这只是一个很简单的小例子,若遇到类似的问题,一定要想到这些细节!希望对大家有帮助!今天就到这里!

转载于:https://www.cnblogs.com/web001/p/8075629.html

### 实现基于时间戳的开关控制 在 Vue3 中可以利用 Composition API 和响应式数据来创建一个基于时间戳的开关组件。通过监听当前时间和设定的时间戳对比,动态改变开关状态。 #### 创建时间戳开关逻辑 定义 `useTimestampSwitch` 组合式函数用于封装业务逻辑: ```typescript import { ref, onMounted, onUnmounted } from 'vue'; function useTimestampSwitch(targetTimestamp: number): { isActive: boolean; } { const isActive = ref(false); let intervalId: NodeJS.Timeout | null = null; function checkStatus() { if (Date.now() >= targetTimestamp) { isActive.value = true; clearInterval(intervalId as NodeJS.Timeout); // 清除定时器防止内存泄漏 } } onMounted(() => { intervalId = setInterval(checkStatus, 1000); checkStatus(); // 初始化时立即检查一次 }); onUnmounted(() => { if (intervalId !== null) { clearInterval(intervalId); } }); return { isActive, }; } ``` 此组合式函数接收目标时间戳作为参数并返回一个布尔类型的响应式属性 `isActive` 表明是否达到指定时间[^1]。 #### 使用自定义指令管理DOM行为 如果希望更进一步,在特定条件下执行一些 DOM 操作,则可以通过自定义指令完成。这里假设当条件满足时显示某个元素;不满足则隐藏该元素。 ```typescript const app = createApp(App); app.directive('show-if-active', { mounted(el, binding) { el.style.display = binding.value ? 'block' : 'none'; }, updated(el, binding) { el.style.display = binding.value ? 'block' : 'none'; } }); ``` 上述代码片段展示了如何注册全局指令 `v-show-if-active` 并在其生命周期钩子内操作样式以展示/隐藏元素。 #### 完整示例:结合两者构建简单页面 下面是一个简单的例子说明怎样把上面提到的概念结合起来形成实际应用中的解决方案。 ```html <template> <div v-show-if-active="switchState.isActive"> 开关已开启! </div> <p>距离触发还有 {{ remainingTime }} 秒</p> </template> <script setup lang="ts"> import { computed } from 'vue'; import { useTimestampSwitch } from './composables/useTimestampSwitch'; // 假设我们想要在这个时间点激活开关 const targetTimestamp = Date.now() + 5 * 60 * 1000; // 当前时间加上五分钟后的毫秒数 const switchState = useTimestampSwitch(targetTimestamp); // 计算剩余时间供视图层使用 const remainingTime = computed(() => Math.max(0, Math.round((targetTimestamp - Date.now()) / 1000))); </script> ``` 这段模板和脚本共同工作实现了如下效果:五分钟后自动切换开关闭合状态,并实时更新界面上显示的倒计时信息[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值