Javascript 30 - Gün 2910 Haziran 2023Projenin demosu : Demo Başlangıç dosyalarını bulabileceğiniz repom: js-30 | github Amaç Bugün için JS ile geri sayım sayacı oluşturacağız.Sayaç önceden tanımlanmış butonlarla başlatılacağı gibi input ile de başlatılabilecek. Çözüm HTML: <div class="timer"> <div class="timer__controls"> <button data-time="20" class="timer__button">20 Secs</button> <button data-time="300" class="timer__button">Work 5</button> <button data-time="900" class="timer__button">Quick 15</button> <button data-time="1200" class="timer__button">Snack 20</button> <button data-time="3600" class="timer__button">Lunch Break</button> <form name="customForm" id="custom"> <input type="text" name="minutes" placeholder="Enter Minutes"> </form> </div> <div class="display"> <h1 class="display__time-left"></h1> <p class="display__end-time"></p> </div> </div> <audio src="./mixkit-classic-clock-gong-1066.wav" /> Javascript: // setInterval'ın referansını saklayacağımız değişken let countdownInterval = null; // DOM elementlerimiz const timerDisplay = document.querySelector('.display__time-left') const endTime = document.querySelector('.display__end-time') const buttons = document.querySelectorAll('[data-time]') const audio = document.querySelector('audio') // <form name="customForm" id="custom"> // form elementimiz "customForm name attribute'una sahip olduğu için // document.querySelector('#custom" yerine // aşağıdaki şekilde seçebiliriz // üstelik bu form içinde yer alan inputumuza da form.minutes ile erişebiliriz const form = document.customForm function countdown(seconds) { // varolan bir sayaç varsa onu silelim // aksi takdirde birden fazla sayaç olacaktır clearInterval(countdownInterval) //fonksiyon başladığı andaki tarihi ve bitmesi gereken tarihi tanımlayalım const now = Date.now() const then = now + seconds * 1000 // kalan zamanı göstermeye yarayan fonksiyonu çağıralım displayTimeLeft(seconds); // bitiş tarihini göstermeye yarayan fonksiyonu çağıralım displayEndTime(then) countdownInterval = setInterval(() => { const secondsLeft = Math.round((then - Date.now()) / 1000) // saniye 0'dan küçük olduğunda sayacı durduralım // ve sesi oynatalım if (secondsLeft < 0) { audio.play() clearInterval(countdownInterval) return } // her saniye kalan zamanı güncelleyelim displayTimeLeft(secondsLeft); }, 1000) } //kalan zamanı gösteren fonksiyon function displayTimeLeft(seconds) { // Math.floor ile artık saniyeleri dikkate almadan tam dakikaları bulalım const minutes = Math.floor(seconds / 60); // artık saniyeleri saklayalım const remainderSeconds = seconds % 60; // kalan sürenin gösterileceği formatı ayarlayalım const display = `${minutes}:${remainderSeconds < 10 ? '0' : ''}${remainderSeconds}` //sayfanın başlığını ve zamanı gösterdiğimiz elementin içeriğini güncelleyelim document.title = display timerDisplay.textContent = display } // bitiş zamanını gösteren fonksiyon function displayEndTime(timestamp) { const end = new Date(timestamp) const hour = end.getHours() const minutes = end.getMinutes(); endTime.textContent = `Be back at ${hour > 12 ? hour - 12 : hour}:${minutes < 10 ? '0' : ''}${minutes}` } // butonlara tıklandığında sayaç başlatacak fonksiyon function startTimer() { const seconds = parseInt(this.dataset.time) countdown(seconds) } buttons.forEach(button => button.addEventListener('click', startTimer)) form.addEventListener('submit', function(e) { // formun varsayılan davranışı url'ye parametre ekleyip sayfayı yenilemek olacaktır bunu engelleyelim e.preventDefault() // 'minutes' name'ine sahip inputtan girilen değeri alalım const mins = this.minutes.value // sayacı başlatalım countdown(mins * 60) // sayaç başlatıldıktan sonra form verilerini silelim this.reset() })GitHubBu sayfayı düzenle