【JavaScript】分秒倒计时器

一、基本目标

在JavaScript设计一个分秒倒计时器,一旦时间完成使按钮变成不可点击状态

具体效果如下图,为了说明问题,调成每50毫秒也就是每0.05跳一次表,


真正使用的时候,把window.onload=function(){...}中的setInterval("clock.move()",50);从50调成1000即可。

在时间用完之前,按钮还是可以点击的。

时间用完之后,按钮就不能点击了。


二、制作过程

[html]  view plain copy print ?
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5. <title>time remaining</title>  
  6. </head>  
  7. <!--html部分很简单,需要被javascript控制的行内文本与提交按钮都被编上ID-->  
  8. <body>  
  9. 剩余时间:<span id="timer"></span>  
  10. <input id="go" type="submit" value="go" />  
  11. </body>  
  12. </html>  
  13. <script>  
  14. /*主函数要使用的函数,进行声明*/  
  15. var clock=new clock();  
  16. /*指向计时器的指针*/  
  17. var timer;  
  18. window.onload=function(){  
  19.     /*主函数就在每50秒调用1次clock函数中的move方法即可*/  
  20.     timer=setInterval("clock.move()",50);  
  21.     }  
  22. function clock(){  
  23.     /*s是clock()中的变量,非var那种全局变量,代表剩余秒数*/  
  24.     this.s=140;  
  25.     this.move=function(){  
  26.         /*输出前先调用exchange函数进行秒到分秒的转换,因为exchange并非在主函数window.onload使用,因此不需要进行声明*/  
  27.         document.getElementById("timer").innerHTML=exchange(this.s);  
  28.         /*每被调用一次,剩余秒数就自减*/  
  29.         this.s=this.s-1;  
  30.         /*如果时间耗尽,那么,弹窗,使按钮不可用,停止不停调用clock函数中的move()*/  
  31.         if(this.s<0){  
  32.             alert("时间到");  
  33.             document.getElementById("go").disabled=true;  
  34.             clearTimeout(timer);  
  35.             }  
  36.         }  
  37.     }  
  38. function exchange(time){  
  39.     /*javascript的除法是浮点除法,必须使用Math.floor取其整数部分*/  
  40.         this.m=Math.floor(time/60);  
  41.         /*存在取余运算*/  
  42.         this.s=(time%60);  
  43.         this.text=this.m+"分"+this.s+"秒";  
  44.         /*传过来的形式参数time不要使用this,而其余在本函数使用的变量则必须使用this*/  
  45.         return this.text;  
  46. }  
  47. </script>  
<think>首先,用户查询是:"我想查找前端实现分秒倒计时的方法 请问前端如何实现分秒倒计时"。这翻译成英文是:"I want to find a method for implementing minute-second countdown in the frontend. How can I implement minute-second countdown in the frontend?" 基于系统级指令,我需要: - 所有行内数学表达式使用 $...$ 格式(但在这个上下文中,可能不涉及数学表达式,所以我可以忽略)。 - 独立公式使用 $$...$$ 格式(同样,可能不适用)。 - LaTeX语法正确(适用于数学内容)。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,比如 [^1]。 用户提供了几个引用: - 引用[1]:描述了一个精确到天时分秒倒计时器,使用 JavaScript,代码示例包括计算时间差并用 setInterval 更新。 - 引用[2]:展示了15分钟倒计时的前端实现,使用 setInterval,并在特定时间点弹出警告。 - 引用[3]:提到使用外部工具 timeBox 进行倒计时计算。 - 引用[4]:讨论了 setInterval 的问题,并提到使用 requestAnimationFrame 和 performance.now() 实现精确倒计时。 用户的具体需求是实现分秒倒计时,即只显示分钟和秒,不需要天和小时。所以,我需要从引用中提取相关方法并进行改编。 结构化回答: 1. **引言**:简要介绍倒计时的基本概念和重要性。 2. **核心方法**:解释如何使用 JavaScript 前端实现分秒倒计时,基于引用提供的方法。 - 使用 setInterval:简单但可能不精确。 - 使用 requestAnimationFrame:更精确,如引用[4]所示。 3. **代码示例**:提供两个代码示例: - 一个基于 setInterval,类似引用[2],但调整为分秒格式。 - 一个基于 requestAnimationFrame,类似引用[4]。 4. **注意事项**:讨论精确性问题,如引用[4]提到的 setInterval 的延迟问题。 5. **相关问题生成**:在回答末尾添加相关问题。 6. **引用标识**:在引用参考的段落末尾添加 [^1], [^2], 等。 确保回答使用中文。 关键点: - 目标:仅显示分钟和秒。 - 方法1(简单):使用 setInterval,每秒钟更新一次。类似于引用[2],但简化。 - 示例:创建一个定时器,显示 "分:秒"。 - 方法2(精确):使用 requestAnimationFrame 和 performance.now() 来计算剩余时间,避免 setInterval 的偏差。 - 类似于引用[4]。 代码示例需要符合要求:如果内联,用行内格式;如果独立,单独成段。在回答中,代码块应该用代码块格式(如示例中的 Python 代码),但在 Markdown 中,我可以使用 ``` 来包裹代码。 系统指令说:"所有行内数学表达式必须使用$...$格式",但代码不是数学表达式,所以代码块应该正常处理。 生成相关问题: - 基于主题:如优化倒计时、处理不同场景、性能考虑等。 参考用户上一次的回复:用户说:"我想查找前端实现分秒倒计时的方法",所以我的回答应该直接针对这个。 最终回答结构: 1. **介绍倒计时**: - 倒计时是前端常见功能,用于显示剩余时间等场景。 2. **实现方法**: - **方法1:简单倒计时(使用 setInterval)** - 解释:通过 setInterval 每秒更新一次时间计算。 - 代码示例:基于引用[2],调整为分秒。 - **方法2:精确倒计时(使用 requestAnimationFrame)** - 解释:处理时间偏移,更精确。 - 代码示例:基于引用[4]。 3. **注意事项**: - 讨论精确性问题。 4. **相关问题**:在末尾列出。 </think>### 前端实现分秒倒计时的方法 倒计时是前端开发中的常见功能,常用于限时活动、考试计时等场景。其核心原理是利用 JavaScript 计算剩余时间,并通过 DOM 操作实时更新显示。分秒倒计时特指只显示分钟和秒(例如 "05:30")。下面我将逐步解释两种主流实现方法:一种是简单的 `setInterval` 方式,另一种是更精确的 `requestAnimationFrame` 方式(解决时间延迟问题)。所有方法均基于您提供的引用内容,并在末尾添加了引用标识。 #### 1. 简单倒计时实现(使用 setInterval) 这种方法简单易用,但可能因事件循环导致轻微时间偏移(例如每秒误差几毫秒),适用于对精度要求不高的场景。核心步骤包括: - 定义总倒计时时间(单位:秒)。 - 使用 `setInterval` 每秒更新一次剩余时间。 - 将剩余时间转换为分钟和秒格式,并显示在页面上。 参考引用[2]中的示例,我将其调整为纯分秒显示(分钟和秒),并优化代码结构。 ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>简单分秒倒计时</title> </head> <body> <div id="countdown" style="font-size: 24px; color: blue;"></div> <script> window.addEventListener('load', function () { const countdownEl = document.getElementById('countdown'); let totalTime = 300; // 初始倒计时时间(单位:秒),例如 5 分钟 let timerId; function updateCountdown() { if (totalTime <= 0) { clearInterval(timerId); countdownEl.textContent = "时间到!"; return; } // 计算分钟和秒数 const minutes = Math.floor(totalTime / 60).toString().padStart(2, '0'); // 分钟,补零 const seconds = Math.floor(totalTime % 60).toString().padStart(2, '0'); // 秒,补零 countdownEl.textContent = `${minutes}分${seconds}秒`; // 显示为 "05:00" 格式 totalTime--; // 每秒减1秒 } timerId = setInterval(updateCountdown, 1000); // 每秒执行一次 }); </script> </body> </html> ``` - **优点**:代码简洁,易于理解。 - **缺点**:`setInterval` 可能存在累积延迟(如引用[4]所述),导致倒计时不精确[^2]。 - **适用场景**:短时间倒计时(如 15 分钟内),用户对精度不敏感的情况。 #### 2. 精确倒计时实现(使用 requestAnimationFrame) 为解决 `setInterval` 的延迟问题,推荐使用 `requestAnimationFrame` 和 `performance.now()`(如引用[4]所述)。这种方法基于高性能时间戳计算剩余时间,确保 UI 更新更流畅和精确。核心步骤包括: - 使用 `performance.now()` 获取高精度起始时间。 - 用 `requestAnimationFrame` 循环更新,计算剩余时间。 - 将毫秒转换为分钟和秒格式显示。 以下代码改编自引用[4],专为分秒倒计时优化: ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>精确分秒倒计时</title> </head> <body> <div id="countdown" style="font-size: 24px; color: green;"></div> <script> window.addEventListener('load', function () { const countdownEl = document.getElementById('countdown'); const duration = 300000; // 倒计时总时长(单位:毫秒),例如 5 分钟 = 300000ms const startTime = performance.now(); // 起始时间(高精度) const endTime = startTime + duration; // 结束时间 function updateCountdown() { const currentTime = performance.now(); const remainingMs = endTime - currentTime; // 剩余毫秒数 if (remainingMs <= 0) { countdownEl.textContent = "时间到!"; return; } // 计算剩余分钟和秒数 const remainingSeconds = Math.floor(remainingMs / 1000); // 转为剩余秒数 const minutes = Math.floor(remainingSeconds / 60).toString().padStart(2, '0'); const seconds = Math.floor(remainingSeconds % 60).toString().padStart(2, '0'); countdownEl.textContent = `${minutes}分${seconds}秒`; // 显示为 "05:00" 格式 requestAnimationFrame(updateCountdown); // 继续循环,确保精确更新 } requestAnimationFrame(updateCountdown); // 启动倒计时 }); </script> </body> </html> ``` - **优点**:减少时间偏差(`performance.now()` 提供毫秒级精度),适用于长时间倒计时。 - **缺点**:代码稍复杂,需处理动画帧率(通常每秒 60 次更新,但 UI 可调整为每秒一次)。 - **适用场景**:高精度需求场景,如在线考试或实时竞拍[^4]。 #### 注意事项 - **时间精确性问题**:`setInterval` 可能因浏览器事件循环导致延迟,而 `requestAnimationFrame` 更接近真实时间(如引用[4]所述),建议优先使用后者[^4]。 - **格式处理**:使用 `padStart(2, '0')` 确保分钟和秒总是两位数(例如 "05" 而非 "5")。 - **外部工具集成**:如引用[3]所述,可导入工具库(如 `timeBox`)简化计算,但需依赖外部资源[^3]。 - **兼容性**:`performance.now()` 在现代浏览器中支持良好,旧浏览器需添加 polyfill。 ### 相关问题 1. 如何优化倒计时的性能以减少内存占用? 2. 在倒计时中如何处理暂停和恢复功能? 3. 前端倒计时有哪些常见的错误及其解决方案? [^1]: 引用[1]: 倒计时:精确到天时分秒的计时器前端设计,基于时间差计算。 [^2]: 引用[2]: 前端页面实现倒计时效果的几种方法,包括简单倒计时示例。 [^3]: 引用[3]: 引入外部工具简化倒计时计算。 [^4]: 引用[4]: setInterval问题以及前端如何实现精确的倒计时,使用requestAnimationFrame和performance.now()。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值