vue+js 实现倒计时,鼠标移动停止,无操作自动倒计时

本文介绍了一个Vue.js组件,用于实现页面加载时自动开始的倒计时功能。当用户进行键盘输入、鼠标点击、滚动或移动时,倒计时暂停;用户无操作后,倒计时会重新开始。倒计时组件在结束时会跳转到首页。通过监听页面事件和设置定时器,确保了倒计时的准确性和交互响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整体功能

1、刚进入页面时、自动开始倒计时
2、当用户有按键盘、鼠标点击、鼠标滚轮、鼠标移动时,停止倒计时
3、停止鼠标事件等,重新开始倒计时。(这里写的不好,还是从最开始的事件重新减的)

倒计时代码

for (let i = 0; i < 1000; i++) {
      clearInterval(i);
      clearTimeout(i);
    }
    (function ($) {
      var funObj = {
        timeUserFun: "timeUserFun",
      };
      $[funObj.timeUserFun] = function (time) {
        var time = time || 2;
        var userTime = time * 10;
        var objTime = {
          init: 0,
          time: function () {
            objTime.init += 1;
            if (objTime.init == userTime) {
              for (let i = 0; i < 1000; i++) {
                clearInterval(i);
                clearTimeout(i);
              }
              console.log("时间到");
              timeUserFun(1);
            }
            console.log(111111, objTime.init);
          },
      eventFun: function () {
        clearInterval(testUser);
        objTime.init = 0;
        testUser = setInterval(objTime.time, 1000);
      },
        };
        var testUser = setInterval(objTime.time, 1000);
    var body = document.querySelector("html");
    body.addEventListener("click", objTime.eventFun);
    body.addEventListener("keydown", objTime.eventFun);
    body.addEventListener("mousemove", objTime.eventFun);
    body.addEventListener("mousewheel", objTime.eventFun);
      };
    })(window);
    timeUserFun(1);

完整代码

这是我写的是一个专门倒计时的组件,倒计时结束后跳首页

<template>
  <!-- 倒计时组件 -->
  <div class="count">
    <span id="secs"></span><span>秒后 返回主页面</span>
    <span class="back" @click="returnback" v-show="showbtn">&lt; 主页面</span>
  </div>
</template>
<script>
export default {
  data() {
    return {
      sec: "",
      settime: "",
      Listener: false,
    };
  },
  props: {
    num: {
      type: [Number, String],
      default: 35,
    },
    showbtn: {
      type: Boolean,
      default: true,
    },
    isstart: {
      type: Boolean,
      default: true,
    },
  },
  watch: {
    isstart(val, oldval) {
      if (val === true) {
        this.listen(this.sec);
      } else {
        this.listen(this.sec);
      }
    },
  },
  methods: {
    returnback() {
      this.$router.push({ path: "home" });
    },
    listen(time) {
      for (let i = 0; i < 1000; i++) {
        clearInterval(i);
        clearTimeout(i);
      }
      (function ($) {
        var funObj = {
          timeUserFun: "timeUserFun",
        };

        $[funObj.timeUserFun] = function (time) {
          var time = time;
          var userTime = time;

          var objTime = {
            init: 0,
            time: function () {
              objTime.init += 1;
              document.querySelector("#secs").innerHTML = time - objTime.init;
              if (objTime.init == userTime) {
                console.log("还剩0秒,返回首页");
                for (let i = 0; i < 1000; i++) {
                  clearInterval(i);
                  clearTimeout(i);
                }
                window.location.href = "home";
                return;
              }
            },

            eventFun: function () {
              clearInterval(testUser);
              objTime.init = 0;
              testUser = setInterval(objTime.time, 1000);
              if (this.isstart == false) {
                clearInterval(testUser);
              }
            },
          };
          var testUser = setInterval(objTime.time, 1000);
          var body = document.querySelector("html");

          body.addEventListener("click", objTime.eventFun);
          body.addEventListener("keydown", objTime.eventFun);
          body.addEventListener("mousemove", objTime.eventFun);
          body.addEventListener("mousewheel", objTime.eventFun);
        };
      })(window);
      if (this.isstart === true) {
        timeUserFun(time);
      }
    },
  },
  mounted() {
    this.sec = this.num;
    // this.settime = setInterval(() => {
    //   if (this.sec > 0 && this.isstart === true) {
    //     this.sec -= 1;
    //   } else if (this.sec > 0 && this.isstart === false) {
    //     clearInterval(this.settime);
    //     this.sec = this.num;
    //   } else {
    //     clearInterval(this.settime);
    //     this.returnback();
    //   }
    // }, 1000);
    this.listen(this.sec);
  },

  beforeDestroy() {
    clearInterval(this.settime);
  },
};
</script>
<style lang="less" scoped>
.count {
  position: absolute;
  right: 0;
  top: 0.36rem;
  color: #5f7585;
  font-size: 0.16rem;
  span {
    font-size: 0.16rem;
  }
  .back {
    background-color: #3277ff;
    margin-left: 0.24rem;
    color: #fff;
    padding: 0.12rem 0.21rem;
    border-radius: 0.8rem;
  }
  .back:active {
    background: #215cd1;
  }
}
</style>

分析

(1)对页面进行监听,一触发就执行倒计时的函数

    var body = document.querySelector("html");
    body.addEventListener("click", objTime.eventFun);
    body.addEventListener("keydown", objTime.eventFun);
    body.addEventListener("mousemove", objTime.eventFun);
    body.addEventListener("mousewheel", objTime.eventFun);

倒计时的函数
mounted()先执行了一次,相当于默认开始倒计时
注意这里的objTime.init是每次都将初始值变为0,重新进行倒计时,实现每次触发后重新回到原来的时间倒计时

          eventFun: function () {
            clearInterval(testUser);
            objTime.init = 0;
            testUser = setInterval(objTime.time, 1000);
          },

(2)这是主体,
注意这里,是每隔一秒执行一次这个函数,然后将倒计时的数字,document.querySelector("#secs").innerHTML 实时写在页面上。

testUser = setInterval(objTime.time, 1000);

注意一定要及时使用clearInterval()

          var objTime = {
            init: 0,
            time: function () {
              objTime.init += 1;
              document.querySelector("#secs").innerHTML = time - objTime.init;
              if (objTime.init == userTime) {
                console.log("还剩0秒,返回首页");
                for (let i = 0; i < 1000; i++) {
                  clearInterval(i);
                  clearTimeout(i);
                }
                window.location.href = "home";
                return;
              }
            },

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值