通过js实现页面的倒计时功能。

思路: 传入一个秒数c,c/60可以得到分钟m, c%60可以得到显示的秒数s,同理,再将m/60可是得到小时数, m/%可以得到分钟数。通过setInterval每次将总秒数-1,并将计算所得时间显示到页面上。
第一版的肮脏代码如下, 可以作为反面教材思考一下
<html>
<head>
<title>Tomato</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
var vTimeLength = 5;
var vHour;
var vMinutes;
var vSeconds;
var vRemainingTime;
function countDown(){
vTimeLength = vTimeLength - 1;
vMinutes = Math.floor(vTimeLength/60);
vSeconds = Math.floor(vTimeLength%60);
if (vMinutes >= 60){
vHour = Math.floor(vMinutes/60);
var vMinutesNew = Math.floor(vMinutes%60);
vRemainingTime = vHour + ":" + vMinutesNew + ":" + vSeconds;
} else {
vRemainingTime = vMinutes + ":" + vSeconds;
}
document.getElementById("div_countDown").innerHTML = vRemainingTime;
if (vTimeLength < 1) {
alert('do sth');
}
}
</script>
</head>
<body>
<div id="div_countDown"></div>
<script type="text/javascript">
setInterval("countDown()", 1000);
</script>
</body>
</html>
缺陷:
1、定义了众多的全局变量,
2、没有复用性,
3、setInterval容易导致队列过多, 结束事件如果是非阻塞事件, 倒计时会继续执行出现负数,
4、不符合面向对象思想。。。
针对缺陷1的解决方案是, 定义一个函数, 将相关全局变量放到函数内部,使之成为局部变量
针对缺陷2:为函数指定参数,提高复用性。 这里定义了3个参数vTimeLength为倒计时总秒数,showTagId为显示到页面元素的id, callback为倒计时结束后的回掉方法
针对缺陷3:用setTimeout替代setInterval
优化后的代码如下:
<html>
<head>
<title>countdown</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
function countDown(vTimeLength, showTagId, callback) {
var vHour;
var vMinutes;
var vMinutesNew
var vSeconds;
var vRemainingTime;
function countDownInner(vTimeLength){
vMinutes = Math.floor(vTimeLength/60);
vSeconds = Math.floor(vTimeLength%60);
if (vMinutes >= 60){
vHour = Math.floor(vMinutes/60);
vMinutesNew = Math.floor(vMinutes%60);
vRemainingTime = vHour + ":" + vMinutesNew + ":" + vSeconds;
} else {
vRemainingTime = vMinutes + ":" + vSeconds;
}
document.getElementById(showTagId).innerHTML = vRemainingTime;
vTimeLength = vTimeLength - 1;
if (vTimeLength > 0) {
setTimeout(function(){countDownInner(vTimeLength);}, 1000);
} else {
callback();
}
}
countDownInner(vTimeLength);
}
</script>
</head>
<body>
<div id="div_countDown"></div>
<script type="text/javascript">
countDown(5, "div_countDown", function(){alert('do sth');});
</script>
</body>
</html>
这里有一点需要注意
setTimeout(function(){countDownInner(vTimeLength);}, 1000);
第一次我将此句写成了
setTimeout(countDownInner(vTimeLength), 1000);
结果函数直接执行了, 没有等待1秒的时间。如果没有入参, 即setTimeout("countDownInner()", 1000); 则可正常执行。
至于前面提到的不够面向对象的缺陷, 也是刚刚接触, 这里贴出代码,希望能够互相交流
<html>
<head>
<title>count_down</title>
<script type="text/javascript">
var countDown = {
flag: true,
hour: 0,
minutes: 0,
minutesNew: 0,
seconds: 0,
show: 0,
current: 0,
length: 0,
showTagId: null,
// callback: null,
countDownInner: function(vTimeLength){
if (!this.flag) {
return;
}
var that=this;
this.current = vTimeLength;
minutes = Math.floor(vTimeLength/60);
seconds = Math.floor(vTimeLength%60);
if (minutes >= 60){
hour = Math.floor(minutes/60);
minutesNew = Math.floor(minutes%60);
show = hour + ":" + minutesNew + ":" + seconds;
} else {
show = minutes + ":" + seconds;
}
document.getElementById(this.showTagId).innerHTML = show;
vTimeLength = vTimeLength - 1;
if (vTimeLength > 0) {
setTimeout(function(){that.countDownInner(vTimeLength);}, 1000);
} else {
setTimeout(function(){that.callback();}, 1000);
}
},
run: function(vTimeLength, showTagId, callback) {
if (!this.flag) {
this.flag = true;
this.countDownInner(this.current);
} else if (showTagId) {
this.length = vTimeLength;
this.showTagId = showTagId;
this.callback = callback;
this.countDownInner(vTimeLength);
}
},
stop: function(){
this.flag = false;
},
restart: function(){
this.flag = true;
this.countDownInner(this.length);
}
};
function countDownStart() {
countDown.run();
}
function countDownStop() {
countDown.stop();
}
</script>
</head>
<body>
<div id="div_countDown"></div>
<script type="text/javascript">
countDown.run(5, 'div_countDown',function(){alert('12')});
</script>
<span>
<button onclick="countDownStart();">start</button>
<button onclick="countDownStop();">stop</button>
</span>
</body>
</html>
一个难点是this的使用, 在函数内部, this是调用当前函数范围,所以setTimeout(function(){this.countDownInner(vTimeLength);}, 1000);会出现undefined。
解决方案是定义一个that变量接收外部函数的this指针,然后通过that即可调用外部域。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# js
# 倒计时
# 纯jsp实现的倒计时动态显示效果完整代码
# JS实现倒计时(天数、时、分、秒)
# PHP+JS实现的商品秒杀倒计时用法示例
# js制作支付倒计时页面
# JavaScript实现刷新不重记的倒计时
# js实现精确到毫秒的倒计时效果
# javascript特效实现——当前时间和倒计时效果的简单实例
# JS/jQ实现免费获取手机验证码倒计时效果
# 点击按钮出现60秒倒计时的简单js代码(推荐)
# js代码实现点击按钮出现60秒倒计时
# 可以得到
# 面向对象
# 复用
# 全局变量
# 并将
# 如果没有
# 不符合
# 将此
# 使之
# 则可
# 再将
# 贴出
# 需要注意
# 容易导致
# 写成了
# 结束后
# 一个函数
# floor
# countDown
相关文章:
网站制作网站,深圳做网站哪家比较好?
建站三合一如何选?哪家性价比更高?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
网站专业制作公司有哪些,做一个公司网站要多少钱?
已有域名能否直接搭建网站?
定制建站如何定义?其核心优势是什么?
如何通过西部建站助手安装IIS服务器?
常州企业建站如何选择最佳模板?
定制建站流程解析:需求评估与SEO优化功能开发指南
网站制作话术技巧,网站推广做的好怎么话术?
建站之星2.7模板快速切换与批量管理功能操作指南
c# 在高并发下使用反射发射(Reflection.Emit)的性能
建站之星免费版是否永久可用?
建站之星导航如何优化提升用户体验?
已有域名如何快速搭建专属网站?
无锡营销型网站制作公司,无锡网选车牌流程?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
高性能网站服务器部署指南:稳定运行与安全配置优化方案
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
C#如何序列化对象为XML XmlSerializer用法
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
如何通过智能用户系统一键生成高效建站方案?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
金*站制作公司有哪些,金华教育集团官网?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
开源网站制作软件,开源网站什么意思?
如何设计高效校园网站?
如何做静态网页,sublimetext3.0制作静态网页?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
制作网站的公司有哪些,做一个公司网站要多少钱?
建站之星后台密码遗忘或太弱?如何重置与强化?
javascript中的try catch异常捕获机制用法分析
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
如何高效生成建站之星成品网站源码?
定制建站价位费用解析与套餐推荐全攻略
宝塔面板如何快速创建新站点?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在香港服务器上快速搭建免备案网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
已有域名和空间,如何快速搭建网站?
如何选择高效便捷的WAP商城建站系统?
定制建站哪家更专业可靠?推荐榜单揭晓
活动邀请函制作网站有哪些,活动邀请函文案?
*请认真填写需求信息,我们会在24小时内与您取得联系。