現在很多網站都有倒計時的功能,比如購物網站的秒殺活動、搶購等。這些倒計時效果都是使用JavaScript實現的,而javascript30s是一個提供練習javascript的網站,其中就有一道題目是實現一個倒計時功能。
這個倒計時需要能夠設置截止時間,并且能實時更新倒計時的時間。我們可以通過JavaScript的Date對象來獲取當前時間,并計算剩余時間。下面是這個倒計時的完整代碼:
function timer(seconds) { const now = Date.now(); const then = now + seconds * 1000; displayTimeLeft(seconds); countDown = setInterval(() => { const secondsLeft = Math.round((then - Date.now()) / 1000); if(secondsLeft < 0) { clearInterval(countDown); return; } displayTimeLeft(secondsLeft); }, 1000); } function displayTimeLeft(seconds) { const minutes = Math.floor(seconds / 60); const remainderSeconds = seconds % 60; const display = <code>${minutes}:${remainderSeconds < 10 ? '0' : ''}${remainderSeconds}</code>; document.title = display; console.log(display); }
這個代碼有兩個函數,一個是timer函數,一個是displayTimeLeft函數。timer函數接收一個參數seconds,表示倒計時的總時間(單位為秒)。它使用Date對象獲取當前時間now,然后加上總時間換算成毫秒的時間戳,得到截止時間then。接著調用displayTimeLeft函數,把總時間傳給它。
displayTimeLeft函數計算出剩余的分鐘數和秒數,并把它們拼接成字符串,然后分別把它們放到title標題中和控制臺輸出。如果剩余秒數小于10,則在前面加一個0,使得輸出的時間格式更加美觀。
timer函數還使用setInterval方法每隔一秒執行一次一個匿名函數。在這個匿名函數中,使用Date對象獲取當前時間和截止時間,計算出剩余的秒數。如果剩余秒數小于0,說明時間已經到了,清除計時器。否則,調用displayTimeLeft函數,把剩余秒數傳給它。
上面的代碼已經實現了一個簡單的倒計時效果。如果你想讓它更加高級,可以添加用戶界面,讓用戶可以選擇倒計時的總時間。這可以使用HTML的input標簽來實現。比如,可以添加一個下面這樣的界面:
<label>Timer Length</label> <input type="number" name="minutes" /> <button>Start Timer</button>
這個HTML代碼包含了一個文本標簽和一個輸入框,讓用戶輸入倒計時的總時間(單位為分鐘),以及一個“Start Timer”按鈕,讓用戶開始倒計時。接下來修改timer函數,把總時間改為從輸入框中獲取,如下:
function timer(minutes) { const now = Date.now(); const then = now + minutes * 60 * 1000; displayTimeLeft(minutes * 60); countDown = setInterval(() => { const secondsLeft = Math.round((then - Date.now()) / 1000); if(secondsLeft < 0) { clearInterval(countDown); return; } displayTimeLeft(secondsLeft); }, 1000); }
這個代碼和之前的代碼相比,只是把輸入的分鐘數轉換成了毫秒數。接下來給“Start Timer”按鈕綁定一個click事件,如下:
const form = document.querySelector('#customTimer'); form.addEventListener('submit', function(e) { e.preventDefault(); const minutes = this.minutes.value; timer(minutes); });
這個代碼首先找到id為“customTimer”的表單,然后給它綁定一個submit事件。這個事件會在用戶按下Enter鍵或點擊“Start Timer”按鈕時觸發。在事件處理函數中,獲取表單中輸入的分鐘數,并把它傳給timer函數。
這樣,這個倒計時就可以根據用戶的輸入開始工作了。當然,這只是一個例子,你可以根據自己的需求來修改它,比如添加聲音效果、添加倒計時結束后的提示信息等。