最近在做一個項目,用到了點擊按鈕實現倒計時,這個用js來實現很簡單。但是遇到了一個問題
頁面刷新后js重新加載導致 倒計時重新開始,或者直接初始化了
后來通過 cookie 保存來實現了js倒計時,關閉頁面和強制刷新都不會停止
主要思路
通過獲取當前時間 與 倒計時停止時間 之間的時間間隔來確定倒計時的數值。
具體如下:
1.首次加載頁面 點擊開始
1) 獲取當前時間 與要倒計時的時間相加獲得要 停止計時的時間
2) 用cookie保存這個停止計時的時候
3) 通過js的setInterval 進行定時刷新時間
4) 當倒計時結束后 清楚cookie中保存的結束時間
2.當第二次進入頁面或刷新頁面時
1)首先判斷cookie中時候有結束時間
2)有取出 和 當前時間求差 如果 差值大於倒計時間隔時間 說明倒計時已結束需要重新點擊 否則就將這個差值作為倒計時開始的數字
3)沒有需要重新點擊開始倒計時
閑話少說,上代碼~~~~
<html>
<head>
<title>JS倒計時(無視刷新)</title>
<style>
.disabled {
background: #fff;
color: #ccc;
border: solid 0px;
}
.disabled:hover {
background:none;
color: #ccc;
}
</style>
</head>
<body>
<input type="tel" placeholder="請輸入手機號" name="Phone">
<a class="fasong" id="btnSend" style="cursor:pointer;">發送驗證碼</a>
</body>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
<script language="javascript">
$(function () {
//點擊發送驗證碼
$('body').on('click', '#btnSend', function () {
$('body').off('click', '#btnSend');
LockButton('#btnSend', 60);
})
//讀取cookie
if ($.cookie("djsendtime") != undefined && !isNaN($.cookie("djsendtime"))) { //讀取到了cookie值
var djsendtime = $.cookie("djsendtime");
var now = new Date().getTime(); //當前時間戳
var locksecends = parseInt((djsendtime - now) / 1000);
if (locksecends <= 0) {
$.cookie("djsendtime", null);
} else {
LockButton('#btnSend', locksecends);
}
}
})
// 按鈕倒計時
var LockButton = function (btnObjId, locksecends) {
//1.獲取當前系統時間
//2.獲取 locksecends 后的系統時間
//3.用cookie保存到期時間
//4.每次加載后獲取cookie中保存的時間
//5.用到期時間減去當前時間獲取倒計時
var djsendtime = $.cookie("djsendtime");
if (djsendtime == null || djsendtime == undefined || djsendtime == 'undefined' || djsendtime == 'null') {
var now = new Date().getTime(); //當前時間戳
var endtime = locksecends * 1000 + now; //結束時間戳
$.cookie("djsendtime", endtime); //將結束時間保存到cookie
}
$(btnObjId).addClass('disabled').attr('disabled', 'disabled').text('(' + locksecends + ')秒后重新獲取');
$('body').off('click', '#btnSendSMS');
var timer = setInterval(function () {
locksecends--;
$(btnObjId).text('(' + locksecends + ')秒后重新獲取');
if (locksecends <= 0) {
//倒計時結束清除cookie值
$.cookie("djsendtime", null);
$(btnObjId).removeClass('disabled').removeAttr('disabled').text('重新獲取');
$('body').on('click', btnObjId);
clearInterval(timer);
}
}, 1000);
};
</script>
</html>
運行:

無論怎么刷新,倒計時都會繼續不會重新開始
