原生js代码实现秒表效果

简介: jQuery用的多了,逐渐忘记了原生js如何书写代码。今天看到一个面试题,利用原生js写一个计算鼠标移入某个区域所停留的时长,移出暂停,再次移入累加。 于是想到了,利用原生js实现一个秒表效果。做之前也搜索了一些秒表效果,是利用setTimeout()实现的。本文是利用setInterval()定时器实现的。 html代码如下: <div> <span id

jQuery用的多了,逐渐忘记了原生js如何书写代码。今天看到一个面试题,利用原生js写一个计算鼠标移入某个区域所停留的时长,移出暂停,再次移入累加。

于是想到了,利用原生js实现一个秒表效果。做之前也搜索了一些秒表效果,是利用setTimeout()实现的。本文是利用setInterval()定时器实现的。

html代码如下:

	<div>
		<span id="date">00</span> -
		<span id="hour">00</span> :
		<span id="min">00</span> :
		<span id="sencond">00</span> :
		<span id="mmss">00</span><br>
		<input type="button" value="开始" id="start">
		<input type="button" value="计次" id="cast">
		<input type="button" value="复位" id="clear">
	</div>
	<div id="cut">
		计次计时:
		<ol id="list">
		</ol>
	</div>

本文实现计时、暂停、计次和复位效果。

css样式如下:

		div{
			width: 300px;
			height:200px;
			background: #333;
			margin:50px auto;
			color: #fff;
			text-align: center;
			line-height: 100px;
		}
		#cut{
			width: 300px;
			height:auto;
			background: #333;
			margin:50px auto;
			color: #fff;
			text-align: center;
			line-height: 24px;
		}
		#cut li{
			margin: 0;
			padding: 0;
		}

如上遍可得到一个简陋的秒表计时界面和记录界面。

首先利用js获取到后面所需的元素:

var date = document.getElementById('date'),<span style="white-space:pre">		</span>//获取存放天数的span标签(做的夸张了单位有点大)
    hour = document.getElementById('hour'),<span style="white-space:pre">	</span>       //<span style="font-family: Arial, Helvetica, sans-serif;">获取存放小时的span标签</span>
    min = document.getElementById('min'),<span style="white-space:pre">		</span>//<span style="font-family: Arial, Helvetica, sans-serif;">获取存放分钟的span标签</span><span style="white-space:pre">
</span>    sencond = document.getElementById('sencond'),<span style="white-space:pre">	</span>//获取存放秒钟的span
    mmss = document.getElementById('mmss'),<span style="white-space:pre">		</span>//获取存放10毫秒单位的span
    start = document.getElementById('start'),<span style="white-space:pre">		</span>//获取开始按钮
    cast = document.getElementById('cast'),<span style="white-space:pre">		</span>//获取计次按钮(英语水平不够)
    clear = document.getElementById('clear'),<span style="white-space:pre">		</span>//获取复位按钮
    list = document.getElementById('list'),<span style="white-space:pre">		</span>//获取计次的存放列表
    d=0,h=0,m=0,s=0,ms=0,<span style="white-space:pre">				</span>//定义存放时间的各个变量
    timer = null;<span style="white-space:pre">					</span>//定义定时器
如上,获取并定义完所有元素,开始让秒表计时。
首先定义定时器函数:

Timer = function(){
	<span style="white-space:pre">	</span>ms++;		// 毫秒自加

		if(ms>99){
			ms=0;<span style="white-space:pre">			</span>//判断ms是否为100;超过99即走过了0-99,100个10毫秒,重置为0,递加到秒
			s++;
		}
<span style="white-space:pre">		sencond.innerHTML</span> <span style="white-space:pre">= </span>s<span style="white-space:pre">;	</span>//输出秒
	<span style="white-space:pre">	</span>mmss.innerHTML = ms; 	// 输出毫秒

	},10);
让毫秒动起来,而且递加到秒。(注:ms为10毫秒)

同理加上如下代码,即可继续递加到分、到小时、到天。。。。

			if(m>59){
				m=0;
				h++;
			}

			if(h>=23){
				h=0;
				d++;
			}

			if(s>59){
				s=0;
				m++;
			}

整理后定时器函数完整代码如下:

		Timer = function(){
			ms++;		// 毫秒自加
<span style="white-space:pre">			</span><pre name="code" class="html"><span style="white-space:pre">			</span>if(h>=23){
				h = 0;
				d++;
			}
if(m>59){m = 0;h++;} //测试时发现大的单位只能放在前面,小的放在后面if(s>59){s = 0;m++;}if(ms>99){ms = 0;s++;}hour.innerHTML = h;date.innerHTML = d;min.innerHTML = m;sencond.innerHTML = s;mmss.innerHTML = ms; // 输出毫秒}
 

然后定义开始事件:

 start1 = function(){
<span style="white-space:pre">	clearInterval(timer);			</span>//防止多次点击,同时启用多个定时器

<span style="white-space:pre">	</span>setInterval(Timer(),10);<span style="white-space:pre">		</span>//启动定时器函数
	start.value='暂停';<span style="white-space:pre">			</span>//点击之后按钮文字变为“暂停”
<span style="white-space:pre">	</span>
	start.setAttribute('onclick','puse()');<span style="white-space:pre">		</span>//为input元素设定onclick属性,并绑定暂停事件
}

将函数绑定到开始按钮:

start.setAttribute('onclick','start1()');

此时的秒表已经可以走动了,但是有一个问题,当秒表数字小于10 的时候只有各位,画面跳动,十分不美观。因此定义一个函数,用来让小于10的时候输出0X;

	addTen=function(a){						// 整理个位数
			
			if(a>=10){
				a = a;
			}else{
				a ='0'+a;
			}
			return a;
	}
然后修改定时器函数中的输出代码:

			hour.innerHTML=addTen(h);
			date.innerHTML=addTen(d);
			min.innerHTML= addTen(m);
			sencond.innerHTML= addTen(s);
			mmss.innerHTML = addTen(ms); 	// 输出毫秒

这样秒表就不会频繁跳动了。

接下来就是暂停事件:

	puse=function(){

		clearInterval(timer);<span style="white-space:pre">			</span>//清除定时器,达到暂停效果

		start.value='继续';<span style="white-space:pre">			</span>//改变value,显示继续

		start.setAttribute('onclick','start1()');<span style="white-space:pre">	</span>//为按钮设置onclick属性,并绑定开始事件

	}
效果为:秒表暂停,暂停按钮变为继续按钮。

然后再添加复位事件:

clear.onclick=function(){

		clearInterval(timer);<span style="white-space:pre">			</span>//清除定时器

		d=0,h=0,m=0,s=0,ms=0;<span style="white-space:pre">			</span>//所有存储变量归零

		mmss.innerHTML='00';
		sencond.innerHTML='00';
		min.innerHTML='00';
		hour.innerHTML='00';
		date.innerHTML='00';<span style="white-space:pre">			</span>//所有数字重置为00

		start.value='开始';
		start.setAttribute('onclick','start1()');<span style="white-space:pre">		</span>//改变开始按钮
	}
因为复位按钮只有一个作用,所以直接将事件添加在按钮上。

最后便是重点,将时间记录下来:

	cast.onclick=function(){
		var newNode = document.createElement('li');			<span style="white-space:pre">		</span>//创建添加li节点
		var cutTime = date.innerHTML+':'+hour.innerHTML+':'+min.innerHTML+':'+sencond.innerHTML+':'+mmss.innerHTML;<span style="white-space:pre">	</span>//获取当前时间
		var cutTimeText = document.createTextNode(cutTime);	<span style="white-space:pre">			</span>//创建文本节点
		newNode.appendChild(cutTimeText);					<span style="white-space:pre">	</span>//将文本节点追加到li节点
		list.appendChild(newNode);
	}
首先要定义li新节点,然后创建文本节点,最后将文本节点添加到定义的li节点上。(当前li为有序列表)

如此一个原生js定时器便完成了。

利用jQuery,实现定时器效果,比原生js简单的多,这里便不贴上代码了。

本人是一名初学者,使用了两个月jQuery,原生js就渐渐忘了,刚好看见一个面试题,就自己试了试。希望能有高手多多指点,谢谢大家。大笑

















目录
相关文章
|
23天前
|
消息中间件 JavaScript 中间件
函数计算产品使用问题之WebIDE编写的Node.js代码是否会自动进行打包部署
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
25天前
|
JavaScript 前端开发 编译器
解锁JavaScript模块化编程新纪元:从CommonJS的基石到ES Modules的飞跃,探索代码组织的艺术与科学
【8月更文挑战第27天】随着Web应用复杂度的提升,JavaScript模块化编程变得至关重要,它能有效降低代码耦合度并提高项目可维护性及扩展性。从CommonJS到ES Modules,模块化标准经历了显著的发展。CommonJS最初专为服务器端设计,通过`require()`同步加载模块。而ES Modules作为官方标准,支持异步加载,更适合浏览器环境,并且能够进行静态分析以优化性能。这两种标准各有特色,但ES Modules凭借其更广泛的跨平台兼容性和现代语法逐渐成为主流。这一演进不仅标志着JavaScript模块化的成熟,也反映了整个JavaScript生态系统的不断完善。
34 3
|
3天前
|
JavaScript
网站内容禁止复制的js代码
网站内容禁止复制的js代码
|
9天前
|
缓存 JavaScript 前端开发
js和html代码一定要分离吗
JavaScript(JS)和HTML代码的分离虽非绝对必要,但通常被推荐
|
12天前
|
移动开发 JavaScript 安全
总有一款适合您分享78个JS相册代码
本文分享了78款JS相册代码,包括3D相册旋转木马、图片悬浮效果、倾斜图片幻灯片切换等特效,适用于各种图片展示场景。无论您需要哪种样式,都能在这里找到满意的解决方案。快来挑选吧!参考链接:[点击这里](https://www.vipwb.com/sitemap.xml)。
23 4
|
13天前
|
JavaScript
分享一款520表白节JS代码
今天给大家分享一款JS表白源码 js会随 随机颜色心形跟随鼠标互动520表白节女神表白利器! 修改的话就搜索:LOVEh 就能找到这个英文了。
8 0
分享一款520表白节JS代码
|
20天前
|
JSON JavaScript 前端开发
如何使用代码注释:关于JavaScript与TypeScript
TSDoc是一种标准化TypeScript代码文档注释的规范,使不同工具能无干扰地提取内容。它包括多种标记,如@alpha、@beta等发布阶段标记;@decorator、@deprecated等功能标记;@defaultValue、@eventProperty等描述标记;@example、@experimental等示例与实验性标记;@inheritDoc、@internal等引用与内部标记;@label、@link等链接标记;@override、@sealed等修饰符标记;以及@packageDocumentation、@param、
25 5
|
22天前
|
JavaScript 前端开发 UED
JavaScript代码技巧大分享,在数组中去重元素
本文介绍了一系列实用的JavaScript函数,包括将内容复制到剪贴板、获取鼠标选中内容、打乱数组顺序、颜色值转换(RGBA与十六进制)、计算平均值、判断奇偶数、数组去重、检查空对象、反转字符串、计算日期间隔、首字母大写、生成随机字符串和随机数等,帮助提升网站的用户体验和功能丰富性。
20 4
|
22天前
|
JavaScript 前端开发 测试技术
如何写高质量的JavaScript代码
在现代Web开发中,JavaScript扮演着至关重要的角色。本文介绍了提升JavaScript代码质量的关键技巧:采用语义化命名增强代码可读性;通过模块化设计提升代码的可维护性和复用性;利用恰当的注释与文档说明代码功能;合理管理全局变量避免命名冲突;实施有效的异常处理增加程序稳定性;并借助工具和框架提高开发效率和代码质量。这些实践共同助力打造高效、可维护的Web应用。代码示例和效果参见相关链接。
20 3
|
22天前
|
JavaScript 前端开发 iOS开发
学习强大的JavaScript一行代码,能够节省你的时间和代码量
这段内容介绍了25个实用的JavaScript一行代码技巧,涵盖复制内容到剪贴板、打乱数组、颜色值转换、计算平均值、检查数字奇偶性、数组去重、对象为空检测、字符串反转、日期计算、首字母大写、生成随机字符串、四舍五入、清除Cookie、检测暗黑模式等,帮助开发者提高效率并简化代码。
17 2