通过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
相关文章:
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
如何快速搭建虚拟主机网站?新手必看指南
制作销售网站教学视频,销售网站有哪些?
如何登录建站主机?访问步骤全解析
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何通过云梦建站系统实现SEO快速优化?
如何做静态网页,sublimetext3.0制作静态网页?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
如何快速搭建高效WAP手机网站?
如何在阿里云虚拟主机上快速搭建个人网站?
微信小程序 input输入框控件详解及实例(多种示例)
建站10G流量真的够用吗?如何应对访问高峰?
山东网站制作公司有哪些,山东大源集团官网?
建站之星安装后如何自定义网站颜色与字体?
如何通过山东自助建站平台快速注册域名?
python的本地网站制作,如何创建本地站点?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
制作网站的软件免费下载,免费制作app哪个平台好?
如何选择服务器才能高效搭建专属网站?
宿州网站制作公司兴策,安徽省低保查询网站?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
如何在服务器上配置二级域名建站?
建站主机服务器选型指南与性能优化方案解析
建站主机助手选型指南:2025年热门推荐与高效部署技巧
孙琪峥织梦建站教程如何优化数据库安全?
css网站制作参考文献有哪些,易聊怎么注册?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
建站之星与建站宝盒如何选择最佳方案?
怀化网站制作公司,怀化新生儿上户网上办理流程?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
如何选择高性价比服务器搭建个人网站?
如何高效利用亚马逊云主机搭建企业网站?
已有域名如何快速搭建专属网站?
如何选择网络建站服务器?高效建站必看指南
网站微信制作软件,如何制作微信链接?
Bpmn 2.0的XML文件怎么画流程图
高端网站建设与定制开发一站式解决方案 中企动力
购物网站制作公司有哪些,哪个购物网站比较好?
用v-html解决Vue.js渲染中html标签不被解析的问题
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
专业公司网站制作公司,用什么语言做企业网站比较好?
已有域名和空间如何搭建网站?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
婚礼视频制作网站,学习*后期制作的网站有哪些?
网站制作报价单模板图片,小松挖机官方网站报价?
PHP 500报错的快速解决方法
如何设置并定期更换建站之星安全管理员密码?
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
*请认真填写需求信息,我们会在24小时内与您取得联系。