IT评测·应用市场-qidao123.com

标题: js 使用 Web Workers 来实现一个正确的倒计时,纵然ios手机锁屏或页面进入 [打印本页]

作者: 渣渣兔    时间: 2025-3-12 08:03
标题: js 使用 Web Workers 来实现一个正确的倒计时,纵然ios手机锁屏或页面进入
## 结果如上
  1. <!-- 将 main.js 和 worker.js 放在同一个目录下,然后在 HTML 文件中引入 main.js -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>Web Worker 倒计时</title>
  8. </head>
  9. <body>
  10.     <h1>Web Worker 倒计时示例</h1>
  11.     <p>打开控制台查看倒计时日志。</p>
  12.     <script src="main.js"></script>
  13. </body>
  14. </html>
复制代码
  1. // main.js
  2. //主线程负责启动 Web Worker,并接收 Web Worker 发送的消息(例如倒计时的剩余时间)。
  3. function padZero(num) {
  4.   if (num < 10) {
  5.       return '0' + num;
  6.   }
  7.   return String(num);
  8. }
  9. // 创建一个新的 Web Worker
  10. const worker = new Worker('worker.js');
  11. // 向 Worker 发送消息,启动倒计时
  12. worker.postMessage({ action: 'start', duration: 60 }); // 60秒倒计时
  13. // 监听 Worker 发送的消息
  14. worker.onmessage = function (event) {
  15.     const duration = event.data.timeLeft;
  16.     if (duration <= 0) {
  17.         console.log('倒计时结束!');
  18.     } else {
  19.       const hours = Math.floor(duration / (60 * 60))
  20.       const remainMin = duration % (60 * 60)
  21.       const mins = Math.floor(remainMin / 60)
  22.       const sec = remainMin % 60
  23.       const showTime=`${padZero(hours)}:${padZero(mins)}:${padZero(sec)}`
  24.         console.log('剩余时间:', showTime);
  25.     }
  26. };
  27. // 如果需要停止倒计时,可以发送停止消息
  28. // worker.postMessage({ action: 'stop' });
复制代码
  1. // worker.js 负责执行倒计时逻辑,并将剩余时间发送回主线程
  2. let timer = null;
  3. // 监听主线程发送的消息
  4. self.onmessage = function (event) {
  5.     const { action, duration } = event.data;
  6.     if (action === 'start') {
  7.         // 记录倒计时开始的时间
  8.         let startTime = duration;
  9.         // 使用 setInterval 每秒更新一次剩余时间
  10.         timer = setInterval(() => {
  11.             const elapsed = Date.now() - startTime; // 已过去的时间
  12.             const timeLeft = startTime -1; // 剩余时间
  13.             startTime=timeLeft
  14.             if (timeLeft <= 0) {
  15.                 clearInterval(timer); // 清除定时器
  16.                 self.postMessage({ timeLeft: 0 }); // 通知主线程倒计时结束
  17.             } else {
  18.                 self.postMessage({ timeLeft }); // 发送剩余时间给主线程
  19.             }
  20.         }, 1000); // 每秒更新一次
  21.     } else if (action === 'stop') {
  22.         // 如果收到停止消息,清除定时器
  23.         clearInterval(timer);
  24.     }
  25. };
复制代码
vue的实现

  1.       // // 将 worker.js 转换为 Blob URL
  2.       // const blob = new Blob([workerCode], { type: 'application/javascript' });
  3.       // const workerURL = URL.createObjectURL(blob);
  4.       // // 初始化 Web Worker
  5.       // this.worker = new Worker(workerURL);
  6.       
  7.       // // 监听 Web Worker 发送的消息
  8.       // this.worker.onmessage = (event) => {
  9.       //   const timeLeft = event.data.timeLeft;
  10.       //   this.duration=timeLeft
  11.       //   if (timeLeft <= 0) {
  12.       //     this.setTime()
  13.       //     this.back("0")
  14.       //   } else {
  15.       //     this.setTime()
  16.       //   }
  17.       // };
  18.       // this.startCountdown()
复制代码
  1. // worker.js
  2. export const workerCode =`
  3. let myTimer = null;
  4. // 监听主线程发送的消息
  5. self.onmessage = function (event) {
  6.     const { action, duration } = event.data;
  7.     if (action === 'start') {
  8.         // 记录倒计时开始的时间
  9.         let startTime = duration;
  10.         // 使用 setInterval 每秒更新一次剩余时间
  11.         myTimer = setInterval(() => {
  12.             const timeLeft = startTime -1; // 剩余时间
  13.             startTime=timeLeft
  14.             if (timeLeft <= 0) {
  15.                 clearInterval(myTimer); // 清除定时器
  16.                 self.postMessage({ timeLeft: 0 }); // 通知主线程倒计时结束
  17.             } else {
  18.                 self.postMessage({ timeLeft }); // 发送剩余时间给主线程
  19.             }
  20.         }, 1000); // 每秒更新一次
  21.     } else if (action === 'stop') {
  22.         // 如果收到停止消息,清除定时器
  23.         clearInterval(myTimer);
  24.     }
  25. };
  26. `
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4