1. 程式人生 > 實用技巧 >多次使用setInterval方法導致clearInterval不能成功關閉

多次使用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>