zoukankan      html  css  js  c++  java
  • 多次使用setInterval方法导致clearInterval不能成功关闭

    以下作为示例:
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>显示网页时钟</title>
        </head>
    	<body>
    		<script>
    			function displayTime(){
    				var time = new Date();
    				var strTime = time.toLocaleString();
    				document.getElementById("timeDiv").innerHTML = strTime;
    			}
    			function start(){
    				s = window.setInterval("displayTime()",1000);
    			}
    			function stop(){
    				window.clearInterval(s);
    			}
    		</script>
    		<input type="button" value="显示系统时间" onclick="start()" />
    		<input type="button" value="停止显示系统时间" onclick="stop()" />
    		<div id="timeDiv"></div>
    	</body>
    </html>
    

    在这里插入图片描述
    在多次点击显示系统时间按钮的情况下,再点击停止显示系统时间,这时发现无法停止。

    原因

    1、多次点击显示系统时间按钮的话,会导致setInterval的ID值不断变化,每点一次ID值加1。
    2、这样clearInterval获取到的ID值就只是当前的ID值。
    3、之前的对应ID值发生的事件就无法停止。多次点击没有把之前的任务覆盖,而是增加了。

    解决办法

    加一个flag标记,使得setInterval只能执行一次,并且必须在clearInterval执行后才能执行第二次。形成相互约束。

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>显示网页时钟</title>
        </head>
    	<body>
    		<script>
    			//flag标记
    			var flag = true;
    			function displayTime(){
    				var time = new Date();
    				var strTime = time.toLocaleString();
    				document.getElementById("timeDiv").innerHTML = strTime;
    			}
    			function start(){
    				//设置权限flag,使start、stop都只能执行一次
    				if(flag){
    					s = window.setInterval("displayTime()",1000);
    					flag = false;
    				}
    			}
    			function stop(){
    				if(!flag){
    					window.clearInterval(s);
    					flag = true;
    				}
    			}
    		</script>
    		<input type="button" value="显示系统时间" onclick="start()" />
    		<input type="button" value="停止显示系统时间" onclick="stop()" />
    		<div id="timeDiv"></div>
    	</body>
    </html>
    
  • 相关阅读:
    c# linq查询的等于大于符号是什么意思?
    c# Socket tcpClient处理连接超时方式timeout
    不同网段服务器与客户端连接问题解决方法TCP/IP_C/S
    Http请求响应及SpringMVC相关注解解析
    Nginx部署项目,转发规则,负载均衡配置
    Linux redis设置后台启动
    Linux centos7安装Jdk nginx redis
    SpringCloud整合SpringSecurity JWT进行认证 ,鉴权
    C#中class与struct的区别概述
    列举ASP.NET 页面之间传递值的几种方式
  • 原文地址:https://www.cnblogs.com/yu011/p/13654023.html
Copyright © 2011-2022 走看看