IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 用JS写了一个30分钟倒计时器 -> 正文阅读

[JavaScript知识库]用JS写了一个30分钟倒计时器

放码过来

<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
		<title>Countdown Timer</title>
		<style type="text/css">
			input{
			    padding-bottom: 0px;
				padding-top: 0px;
				border-top-width: 0px;
				border-left-width: 0px;
				border-right-width: 0px;
				font-size: 20px;
				width:100%;
			}
		</style>
	</head>
	
	<body>
		<span id="numbers" style="white-space:nowrap;"></span>
		
		<table id="table1" >
			<tr>
				<td style="background-color:rgb(41, 74, 155);padding:3px;"></td>
				<td></td>
			</tr>
			<tr>
				<td style="width:100%;" colspan=2>
					<input id="content"/>
				</td>
			</tr>
			<tr>
				<td style="width:100%;" colspan=2>
					<canvas id="myCanvas" height="6">
					Your browser does not support the canvas element.
					</canvas>
				</td>
			</tr>
			
			
		</table>
		
		<audio id='music'>
		  <source src="music/Windows XP 启动.wav" type="audio/mpeg">
		  Your browser does not support the audio tag.
		</audio>
		
		<audio id='music2'>
		  <source src="music/Windows XP 关机.wav" type="audio/mpeg">
		  Your browser does not support the audio tag.
		</audio>
		
		<script type="text/javascript" >

			var timer = {
				initMinutes:30,
				restSeconds:0,
				minute:0,
				second:0,
				handle:0,
				stopFlag:false,
				startTime:0,
				content:"asdasd",
				coverFlag:false,
				setFontSize:function(){
					document.getElementById("numbers").style.fontSize = (window.innerWidth
								|| document.documentElement.clientWidth
								|| document.body.clientWidth) / 3 + "px"
				},
				refreshTable:function(){
					//进度条
					var table = document.getElementById("table1")
					var span = document.getElementById('numbers')
					
					//刷新进度条
					//table2.style.width = 
					table.style.width = span.offsetWidth + "px"

					var progress = 1
					
					if(this.restSeconds > 0)
						progress = this.restSeconds / (this.initMinutes * 60)
					
					document.querySelector('#table1 td:nth-of-type(1)').style.width = progress * 100 + "%"
					
					var td2 = document.querySelector('#table1 td:nth-of-type(2)')
					
					if (progress < 1){
						td2.style.width = (1 - progress) * 100 + "%"
					}else{
						td2.style.display = "none"
					}
					
					var canvas = document.getElementById('myCanvas')
					canvas.width = span.offsetWidth
					
					var ctx = canvas.getContext("2d")
					var rectWeight = progress * span.offsetWidth
					
					ctx.clearRect(0, 0, span.offsetWidth, 20)
					ctx.fillStyle = "#FF0000"
					//console.log("rectWeight: " + rectWeight)
					//console.log(progress * span.offsetWidth)
					ctx.fillRect(0, 0, rectWeight, 20)
				},
				init:function(){
					this.startTime = Date.now()
					var span = document.getElementById('numbers')
					this.setFontSize()
					
					this.restSeconds = this.initMinutes * 60 
					this.minute = this.initMinutes
					
					var obj = this
					
					this.handle = setInterval(function(){
						
						if(obj.stopFlag)
							return
						
						if(obj.restSeconds > 0){
							span.innerHTML = "" + (obj.minute < 10 ? "0" + obj.minute : obj.minute) + ":" + 
							(!obj.coverFlag ? (obj.second < 10 ? "0" + obj.second : obj.second) : "&nbsp;".repeat(4))
							
							if(obj.restSeconds > 0){
								obj.restSeconds -= 1
							}
							
							obj.minute =  Math.floor(obj.restSeconds / 60)
							obj.second =  obj.restSeconds - obj.minute * 60
							
							//刷新进度条
							obj.refreshTable()
							
						}else{
							span.innerHTML = "Time "
							window.clearInterval(obj.handle)
							document.getElementById("music2").play()
							
							//跑完后记录
							var content = document.getElementById("content").value
							obj.markdownRecord(content)
							
							//不停地闪烁
							window.setInterval(function(){
								span.innerHTML = (span.innerHTML == "Time ")?"is up.":"Time "
							}, 5000)
						}
						
					}, 1000)
					
					document.getElementById("music").play()
					
					var numbers = document.getElementById("numbers")
					
					numbers.addEventListener("click", function(){
						obj.coverFlag = !obj.coverFlag
					})

					numbers.addEventListener("dblclick", function(){
						obj.stopFlag = !obj.stopFlag
					})

					document.getElementById('content').addEventListener("blur", function(){

						if(obj.restSeconds > 0)
							return
						
						var content = document.getElementById("content").value
						
						if(this.content != content){
							this.content = content
							obj.markdownRecord(content)
						}
					})
					
					document.getElementById('table1').addEventListener("dblclick", function(){
						console.log("timerHistory:")
						console.log(localStorage.getItem('timerHistory'))
						console.log("\n")
						obj.exportHistory()
					})
					
				},
				markdownRecord:function(content){
					var records = []
					var timerHistory = localStorage.getItem("timerHistory")
					
					if(timerHistory != null){
						records = JSON.parse(timerHistory)
					}
					
					var lastRecord = records[0]
					
					if(lastRecord && lastRecord.start == this.startTime){
						lastRecord.note = content
					}else{
						var history = {
							start:this.startTime,
							duration:this.initMinutes,
							note:content
						}
						records.unshift(history)//数组头插入元素			
					}
					
					var recordsJson = JSON.stringify(records)
					
					//将结果存入本地
					localStorage.setItem("timerHistory", recordsJson)
					
					console.log(records[0])
					console.log("Marked it Down.")
					
				},
				exportHistory:function(){

					var filename = 'record' + Date.now() +'.txt'
					var text = localStorage.getItem('timerHistory')
					this.exportFile(filename, text)
				},
				exportFile:function(filename, text){
					var element = document.createElement('a');
					element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
					element.setAttribute('download', filename);

					element.style.display = 'none';
					document.body.appendChild(element);

					element.click();

					document.body.removeChild(element);
				}
			}
			

			window.onresize = function(){
				timer.setFontSize()
				timer.refreshTable()
			}
			
			//pause
			window.onclick = function(){
				//timer.stopFlag = !timer.stopFlag
			}
			
			//main
			window.onload = function(){
				timer.init()	
			}
		</script>
	</body>
</html> 

效果图

在这里插入图片描述

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:41:13  更:2022-03-13 21:44:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:56:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码