js 使用 Web Workers 来实现一个精确的倒计时,即使ios手机锁屏或页面进入后台,倒计时也不会暂停。

在这里插入图片描述## 效果如上

<!-- 将 main.js 和 worker.js 放在同一个目录下,然后在 HTML 文件中引入 main.js --><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Web Worker 倒计时</title>
</head>
<body><h1>Web Worker 倒计时示例</h1><p>打开控制台查看倒计时日志。</p><script src="main.js"></script>
</body>
</html>
// main.js
//主线程负责启动 Web Worker,并接收 Web Worker 发送的消息(例如倒计时的剩余时间)。
function padZero(num) {if (num < 10) {return '0' + num;}return String(num);
}
// 创建一个新的 Web Worker
const worker = new Worker('worker.js');// 向 Worker 发送消息,启动倒计时
worker.postMessage({ action: 'start', duration: 60 }); // 60秒倒计时// 监听 Worker 发送的消息
worker.onmessage = function (event) {const duration = event.data.timeLeft;if (duration <= 0) {console.log('倒计时结束!');} else {const hours = Math.floor(duration / (60 * 60))const remainMin = duration % (60 * 60)const mins = Math.floor(remainMin / 60)const sec = remainMin % 60const showTime=`${padZero(hours)}:${padZero(mins)}:${padZero(sec)}`console.log('剩余时间:', showTime);}
};// 如果需要停止倒计时,可以发送停止消息
// worker.postMessage({ action: 'stop' });
// worker.js 负责执行倒计时逻辑,并将剩余时间发送回主线程let timer = null;// 监听主线程发送的消息
self.onmessage = function (event) {const { action, duration } = event.data;if (action === 'start') {// 记录倒计时开始的时间let startTime = duration;// 使用 setInterval 每秒更新一次剩余时间timer = setInterval(() => {const elapsed = Date.now() - startTime; // 已过去的时间const timeLeft = startTime -1; // 剩余时间startTime=timeLeftif (timeLeft <= 0) {clearInterval(timer); // 清除定时器self.postMessage({ timeLeft: 0 }); // 通知主线程倒计时结束} else {self.postMessage({ timeLeft }); // 发送剩余时间给主线程}}, 1000); // 每秒更新一次} else if (action === 'stop') {// 如果收到停止消息,清除定时器clearInterval(timer);}
};

vue的实现

      // // 将 worker.js 转换为 Blob URL// const blob = new Blob([workerCode], { type: 'application/javascript' });// const workerURL = URL.createObjectURL(blob);// // 初始化 Web Worker// this.worker = new Worker(workerURL);// // 监听 Web Worker 发送的消息// this.worker.onmessage = (event) => {//   const timeLeft = event.data.timeLeft;//   this.duration=timeLeft//   if (timeLeft <= 0) {//     this.setTime()//     this.back("0")//   } else {//     this.setTime()//   }// };// this.startCountdown()
// worker.js
export const workerCode =`
let myTimer = null;// 监听主线程发送的消息
self.onmessage = function (event) {const { action, duration } = event.data;if (action === 'start') {// 记录倒计时开始的时间let startTime = duration;// 使用 setInterval 每秒更新一次剩余时间myTimer = setInterval(() => {const timeLeft = startTime -1; // 剩余时间startTime=timeLeftif (timeLeft <= 0) {clearInterval(myTimer); // 清除定时器self.postMessage({ timeLeft: 0 }); // 通知主线程倒计时结束} else {self.postMessage({ timeLeft }); // 发送剩余时间给主线程}}, 1000); // 每秒更新一次} else if (action === 'stop') {// 如果收到停止消息,清除定时器clearInterval(myTimer);}
};
`

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 Linux 中的 -h 选项:让命令输出更“人性化”

在 Linux 系统中&#xff0c;命令行工具是系统管理员和普通用户最常用的交互方式之一。然而&#xff0c;命令行输出往往充满了技术性术语和数字&#xff0c;对于初学者或非技术用户来说可能显得晦涩难懂。幸运的是&#xff0c;许多 Linux 命令都提供了一个非常实用的选项&#…

Docker Compose国内镜像一键部署dify

克隆代码 git clone https://github.com/langgenius/dify.git进入docker目录 cd docker修改.env部分 # 将环境模版文件变量重命名 cp .env.example .env # 修改 .env,修改nginx的host和端口,避免端口冲突 NGINX_SERVER_NAME192.168.1.223 NGINX_PORT1880 NGINX_SSL_PORT1443…

红队OPSEC(安全运营)个人总结

OPSEC又称&#xff1a;运营安全&#xff0c;是指在红队的视角下&#xff0c;蓝队对我方的威胁。 OPSEC漏洞的五个流程&#xff1a; 关键信息识别&#xff1a;指红队的关键信息不泄露&#xff0c;包括但不限于红队的攻击意图&#xff0c;能力&#xff0c;人员&#xff0c;活动及…

NO.29十六届蓝桥杯备战|string九道练习|reverse|翻转|回文(C++)

P5015 [NOIP 2018 普及组] 标题统计 - 洛谷 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);string s;getline(cin, s);int sz s.size();int cnt 0;for (int i 0; i < sz; i){if (isspace(s[i]))continue…

MongoDB 触发器实现教程

在传统的关系型数据库&#xff08;如 MySQL&#xff09;中&#xff0c;触发器是一种强大的工具&#xff0c;它可以在特定的数据库操作&#xff08;如插入、更新或删除&#xff09;发生时自动执行一段代码。然而&#xff0c;MongoDB 并没有原生内置的触发器概念。不过&#xff0…

C#控制台应用程序学习——3.11

一、整型数字计算 如果我们想执行以下程序&#xff1a;程序提示用户输入一个数字并输出 num 20 的结果&#xff0c;我们的思维应该是这样的&#xff1a; using System;public class Class1 {public static void Main(string[] args){Console.WriteLine("Enter the first…

【C语言】指针篇

目录 C 语言指针概述指针的声明和初始化声明指针初始化指针 指针的操作解引用操作指针算术运算 指针的用途动态内存分配作为函数参数 指针与数组数组名作为指针通过指针访问数组元素指针算术和数组数组作为函数参数指针数组和数组指针指针数组数组指针 函数指针函数指针的定义和…

嵌入式音视频通话SDK组件EasyRTC:全平台设备兼容,智能硬件里的WebRTC调用实践

在万物互联时代&#xff0c;智能硬件设备对实时音视频通信的需求呈现爆发式增长。传统基于PC或移动端的WebRTC方案难以满足嵌入式设备在资源占用、低延迟传输和硬件适配等方面的特殊需求。本文将深入探讨如何通过EasyRTC嵌入式音视频通信SDK在嵌入式设备中实现高效的WebRTC视频…

Aim Robotics电动胶枪:机器人涂胶点胶的高效解决方案

在自动化和智能制造领域&#xff0c;机器人技术的应用越来越广泛&#xff0c;而涂胶和点胶作为生产过程中的重要环节&#xff0c;也逐渐实现了自动化和智能化。Aim Robotics作为一家专注于机器人技术的公司&#xff0c;其推出的电动胶枪为这一领域带来了高效、灵活且易于操作的…

c语言笔记 数组进阶题目的理解

题目&#xff1a;声明一个二维 int 型数组 a&#xff0c;再声明另一个一维数组指针数组 b&#xff0c;使该数组 b 的每一个指针分别指向二维数组 a 中的每一个元素(即每一个一维数组)&#xff0c;然后利用数组 b 计算数组 a 的和。 图解&#xff1a;画图帮助理解 我们要清楚什…

Photo Works在线图片编辑器:一键修复老照片,轻松焕新记忆

★【概况介绍】 今天突然收到我的朋友电脑出故障了,截图给我,我一看就知道这个是缺少必要的组件引起的故障。结合这个问题,我来谈谈自己的解决思路和方法,希望能够帮助到大家。帮助大家是我最开心的事情。以前只是帮朋友解决问题,没有记录下来,刚刚接触到这个平台,刚好可…

FANformer:融合傅里叶分析网络的大语言模型基础架构

近期大语言模型(LLM)的基准测试结果引发了对现有架构扩展性的思考。尽管OpenAI推出的GPT-4.5被定位为其最强大的聊天模型&#xff0c;但在多项关键基准测试上的表现却不及某些规模较小的模型。DeepSeek-V3在AIME 2024评测中达到了39.2%的Pass1准确率&#xff0c;在SWE-bench Ve…

【 IEEE出版 | 快速稳定EI检索 | 往届已EI检索】2025年储能及能源转换国际学术会议(ESEC 2025)

重要信息 主会官网&#xff1a;www.net-lc.net 【论文【】投稿】 会议时间&#xff1a;2025年5月9-11日 会议地点&#xff1a;中国-杭州 截稿时间&#xff1a;见官网 提交检索&#xff1a;IEEE Xplore, EI Compendex, Scopus 主会NET-LC 2025已进入IEEE 会议官方列表!&am…

蓝桥杯练题顺序

有重复,适当选择题目~共229道题&#xff01; 后续会发题解~ STL&#xff1a;9 3100 反转字符串 [string简单]---3100 -CSDN博客 2470 单调栈 [stack简单]---2470 单调栈 [stack简单]-CSDN博客 2254 括号匹配&#xff01; [stack简单]---2254: 括号匹配&#xff01;-CSDN博客 …

react基础语法视图层类组件

react基础语法视图层&类组件 MVVM *区别mvc&mvvm 两者的区别&#xff1a; 数据模型去渲染视图。数据层改了&#xff0c;vue自己会监听到帮我们拿最新的数据去渲染视图&#xff1b;构建数据构建视图&#xff0c;数据驱动的思想。这一套是非常相似的。 视图中的内容改变&…

开发、科研、日常办公工具汇总(自用,持续更新)

主要记录汇总一下自己平常会用到的网站工具&#xff0c;方便查阅。 update&#xff1a;2025/2/11&#xff08;开发网站补一下&#xff09; update&#xff1a;2025/2/21&#xff08;补充一些AI工具&#xff0c;刚好在做AI视频相关工作&#xff09; update&#xff1a;2025/3/7…

requests中post中data=None, json=None两个参数区别

在 requests.post() 方法中&#xff0c;data 和 json 主要用于发送请求体&#xff0c;但它们的作用和格式有所不同。 1. data 参数 用途&#xff1a;用于发送表单数据或原始二进制数据。格式&#xff1a; 可以是 字典&#xff08;dict&#xff09;&#xff08;默认会编码为 a…

51c大模型~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/11547799 #Llama 3.1 美国太平洋时间 7 月 23 日&#xff0c;Meta 公司发布了其最新的 AI 模型 Llama 3.1&#xff0c;这是一个里程碑时刻。Llama 3.1 的发布让我们看到了开源 LLM 有与闭源 LLM 一较高下的能力。 Meta …

架构演变 之 超市进化

1. 单机架构 → 小卖部&#xff08;夫妻店&#xff09; 场景&#xff1a;一个老板包揽所有工作——进货、摆货、收银、打扫&#xff0c;店里只有一个小仓库。对应架构&#xff1a;所有功能&#xff08;数据库、业务逻辑、页面&#xff09;都挤在一台服务器上。问题&#xff1a…

ubuntu 和 RV1126 交叉编译Mosqutiio-1.6.9

最近需要交叉编译mosquitto&#xff0c;遇到一些小问题记录一下。 1.众所周知使用它自带的Makefile编译的时候&#xff0c;只需要在编译前&#xff0c;指定它config.mk中的变量&#xff1a;CFLAGS头文件路径 和 LDFLAGS库文件路径就ok&#xff0c;例子如下&#xff1a; expor…