1const Q = s => document.querySelector(s) 2const QA = s => document.querySelectorAll(s) 3const pad = n => String(n).padStart(2, '0') 4 5 6 7function initCountdown(countdown) { 8 if(!countdown) return 9 10 const time = countdown.querySelector('time') 11 if(!time?.dateTime) return 12 13 const deadline = new Date(time.dateTime).getTime() 14 if(Number.isNaN(deadline)) return 15 16 const els = { 17 days : countdown.querySelector('.days .countdown__value'), 18 hours : countdown.querySelector('.hours .countdown__value'), 19 minutes : countdown.querySelector('.minutes .countdown__value'), 20 seconds : countdown.querySelector('.seconds .countdown__value') 21 } 22 23 if(!els.days || !els.hours || !els.minutes || !els.seconds) return 24 25 let timerId = null 26 27 function render() { 28 const diff = Math.max(0, deadline - Date.now()) 29 const totalSeconds = Math.floor(diff / 1000) 30 31 const days = Math.floor(totalSeconds / 86400) 32 const hours = Math.floor((totalSeconds % 86400) / 3600) 33 const minutes = Math.floor((totalSeconds % 3600) / 60) 34 const seconds = totalSeconds % 60 35 36 // els.days.textContent = pad(days) 37 // els.hours.textContent = pad(hours) 38 // els.minutes.textContent = pad(minutes) 39 // els.seconds.textContent = pad(seconds) 40 41 els.days.textContent = days 42 els.hours.textContent = hours 43 els.minutes.textContent = minutes 44 els.seconds.textContent = seconds 45 46 if(diff <= 0) { 47 timerId = null 48 els.days.textContent = 0 49 els.hours.textContent = 0 50 els.minutes.textContent = 0 51 els.seconds.textContent = 0 52 return 53 } 54 55 timerId = setTimeout(render, 1000 - (Date.now() % 1000)) 56 } 57 58 render() 59 60 return { 61 destroy() { 62 if(timerId) clearTimeout(timerId) 63 } 64 } 65} 66 67 68 69QA('.countdown').forEach(item => initCountdown(item))
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.