
ææ¶ï¼æ¨å°éè¦æå»ºä¸ä¸ªJavaScriptåæ°æ¶éãæ¨å¯è½ææ´»å¨ï¼éå®ï¼ä¿éææ¸¸æãæ¨å¯ä»¥ä½¿ç¨åå§JavaScriptæå»ºæ¶éï¼èä¸ç¨å¯»æ¾æè¿çæä»¶ãè½ç¶æå¾å¤å¾æ£çæ¶éæä»¶ï¼ä½æ¯ä½¿ç¨åå§JavaScriptå¯ä»¥å¸¦æ¥ä»¥ä¸å¥½å¤ï¼
æ¨ç代ç å°æ¯è½»é级çï¼å 为å®å°å ·æé¶ä¾èµæ§ã
æ¨çç½ç«å°è¡¨ç°æ´å¥½ãæ¨æ éå è½½å¤é¨èæ¬åæ ·å¼è¡¨ã
æ¨å°æ¥ææ´å¤æ§å¶æãæ¨å°æå»ºæ¶éï¼ä½¿å ¶è¡ä¸ºå®å ¨ç¬¦åæ¨å¸æçæ¹å¼(è䏿¯å°è¯å°æä»¶å¼¯æ²å°æ¨çææ¿)ã
å æ¤ï¼äºä¸å®è¿ï¼è¿éä»ç»äºå¦ä½ä» ç¨18è¡JavaScriptæ¥å¶ä½èªå·±çåè®¡æ¶æ¶é

åºæ¬æ¶éï¼åæ°å°ç¹å®çæ¥æææ¶é´
以䏿¯åå»ºåºæ¬æ¶éææ¶åæ¥éª¤çå¿«éæ¦è¿°ï¼
设置ææçç»ææ¥æã
计ç®å©ä½æ¶é´ã
å°æ¶é´è½¬æ¢ä¸ºå¯ç¨æ ¼å¼ã
å°æ¶éæ°æ®è¾åºä¸ºå¯éå¤ä½¿ç¨ç对象ã
å¨é¡µé¢ä¸æ¾ç¤ºæ¶éï¼å¹¶å¨æ¶éä¸ºé¶æ¶åæ¢æ¶éã
è®¾å®ææçç»ææ¥æ
é¦å ï¼æ¨éè¦è®¾ç½®ä¸ä¸ªææçç»ææ¥æãè¿åºè¯¥æ¯JavaScriptçDate.parse()æ¹æ³å¯ä»¥çè§£ç任使 ¼å¼çå符串ãä¾å¦ï¼
å¨ISO 8601æ ¼å¼ï¼
const deadline = '2015-12-31';
ç®çæ ¼å¼ï¼
const deadline = '31/12/2015';
æè ï¼é¿æ ¼å¼ï¼
const deadline = 'December 31 2015';
è¿äºæ ¼å¼ä¸çæ¯ä¸ç§é½å è®¸æ¨æå®ç¡®åçæ¶é´åæ¶åº(对äºISOæ¥æï¼å为UTCçåç§»é)ãä¾å¦ï¼
const deadline = 'December 31 2015 23:59:59 GMT+0200';
æ¨å¯ä»¥å¨æ¬æä¸é 读æå ³JavaScript䏿¥ææ ¼å¼çæ´å¤ä¿¡æ¯ã
计ç®å©ä½æ¶é´
ä¸ä¸æ¥æ¯è®¡ç®å©ä½æ¶é´ãæä»¬éè¦ç¼åä¸ä¸ªå½æ°ï¼è¯¥å½æ°éè¦ä¸ä¸ªè¡¨ç¤ºç»å®ç»ææ¶é´çå符串(å¦ä¸æè¿°)ãç¶åï¼æä»¬è®¡ç®è¯¥æ¶é´ä¸å½åæ¶é´ä¹é´çæ¶å·®ãçèµ·æ¥åè¿æ ·ï¼
function getTimeRemaining(endtime){
const total = Date.parse(endtime) - Date.parse(new Date());
const seconds = Math.floor( (total/1000) % 60 );
const minutes = Math.floor( (total/1000/60) % 60 );
const hours = Math.floor( (total/(1000*60*60)) % 24 );
const days = Math.floor( total/(1000*60*60*24) );
return {
total,
days,
hours,
minutes,
seconds
};
}
é¦å ï¼æä»¬å建ä¸ä¸ªåétotalï¼ä»¥ä¿çå©ä½æ¶é´ç´å°æªæ¢æ¥æã该Date.parse()彿°å°æ¶é´å符串转æ¢ä¸ºæ¯«ç§å¼ãè¿ä½¿æä»¬å¯ä»¥ç¸å两次ï¼å¹¶è·å¾ä¸¤è ä¹é´çæ¶é´éã
const total = Date.parse(endtime) - Date.parse(new Date());
å°æ¶é´è½¬æ¢ä¸ºå¯ç¨æ ¼å¼
ç°å¨ï¼æä»¬è¦å°æ¯«ç§è½¬æ¢ä¸ºå¤©ï¼å°æ¶ï¼åéåç§ã让æä»¬ä»¥ç§ä¸ºä¾ï¼
const seconds = Math.floor( (t/1000) % 60 );
让æä»¬åè§£ä¸ä¸è¿éåççäºæ ã
å°æ¯«ç§é¤ä»¥1000å¯è½¬æ¢ä¸ºç§ï¼ (t/1000)
å°æ»ç§æ°é¤ä»¥60ï¼ç¶åå使°ãæ¨ä¸å¸æææçç§æ°ï¼ä» éè¦è®¡ç®åéæ°ä¹åå©ä¸çç§æ°ï¼(t/1000) % 60
åèäºå ¥å°ææ¥è¿çæ´æ°ãè¿æ¯å 为æ¨éè¦å®æ´çç§æ°ï¼è䏿¯å åä¹ä¸ç§ï¼Math.floor( (t/1000) % 60 )
é夿¤é»è¾ï¼å°æ¯«ç§è½¬æ¢ä¸ºåéï¼å°æ¶å天ã
è¾åºæ¶éæ°æ®ä½ä¸ºå¯éç¨å¯¹è±¡
åå¤å¥½å 天ï¼å å°æ¶ï¼å åéåå ç§éä¹åï¼æä»¬ç°å¨å¯ä»¥å°æ°æ®ä½ä¸ºå¯éç¨ç对象è¿åï¼
return {
total,
days,
hours,
minutes,
seconds
};
该对象å 许æ¨è°ç¨å½æ°å¹¶è·åä»»ä½è®¡ç®å¼ãè¿æ¯å¦ä½è·åå©ä½æ¶é´ç示ä¾ï¼
getTimeRemaining(deadline).minutes
æ¹ä¾¿å§?
æ¾ç¤ºæ¶éå¹¶å¨è¾¾å°é¶æ¶åæ¢
ç°å¨ï¼æä»¬æäºä¸ä¸ªå¯ä»¥è±è´¹å©ä½ç天ï¼å°æ¶ï¼åéåç§çåè½ï¼æä»¬å¯ä»¥æå»ºæ¶éäºãé¦å ï¼æä»¬å°å建以ä¸HTMLå ç´ æ¥ä¿åæ¶éï¼
ç¶åï¼æä»¬å°ç¼åä¸ä¸ªå¨æ°divä¸è¾åºæ¶éæ°æ®ç彿°ï¼
function initializeClock(id, endtime) {
const clock = document.getElementById(id);
const timeinterval = setInterval(() => {
const t = getTimeRemaining(endtime);
clock.innerHTML = 'days: ' + t.days + '
' +
'hours: '+ t.hours + '
' +
'minutes: ' + t.minutes + '
' +
'seconds: ' + t.seconds;
if (t.total <= 0) {
clearInterval(timeinterval);
}
},1000);
}
è¯¥å½æ°æä¸¤ä¸ªåæ°ãè¿äºæ¯å 嫿们æ¶éçå ç´ çIDï¼ä»¥åå计æ¶çç»ææ¶é´ãå¨å½æ°å é¨ï¼æä»¬å°å£°æä¸ä¸ªclockåéå¹¶å°å ¶ç¨äºåå¨å¯¹æä»¬çæ¶é容å¨divçå¼ç¨ãè¿æå³çæä»¬ä¸å¿ ç»§ç»æ¥è¯¢DOMã
æ¥ä¸æ¥ï¼æä»¬å°ä½¿ç¨setIntervalæ¯ç§æ§è¡ä¸ä¸ªå¿å彿°ãæ¤åè½å°æ§è¡ä»¥ä¸æä½ï¼
计ç®å©ä½æ¶é´ã
å°å©ä½æ¶é´è¾åºå°æä»¬çdivã
妿å©ä½æ¶é´ä¸ºé¶ï¼è¯·åæ¢è®¡æ¶ã
æ¤æ¶ï¼å©ä¸çå¯ä¸æ¥éª¤æ¯åè¿æ ·è¿è¡æ¶éï¼
initializeClock('clockdiv', deadline);
æåä½ !ç°å¨ï¼æ¨ä» ç¨18è¡JavaScriptå°±æ¥æäºä¸ä¸ªåºæ¬æ¶éã
å夿¾ç¤ºæ¶é
å¨è®¾ç½®æ¶éæ ·å¼ä¹åï¼æä»¬éè¦è¿è¡ä¸äºç»åã
æ¶é¤åå§å»¶è¿ï¼ä½¿æ¨çæ¶éç«å³æ¾ç¤ºã
æé«æ¶éèæ¬çæçï¼ä»¥å æç»é建æ´ä¸ªæ¶éã
æ ¹æ®éè¦æ·»å å导é¶ã
æ¶é¤åå§å»¶è¿
卿¶éä¸ï¼æä»¬ä¹ æ¯äºsetIntervalæ¯ç§æ´æ°ä¸æ¬¡æ¾ç¤ºã夿°æ åµä¸ï¼è¿å¾å¥½ï¼é¤éå¨å¼å§æ¶ä¼æä¸ç§éçå»¶è¿ãè¦æ¶é¤æ¤å»¶è¿ï¼æä»¬å¿ é¡»å¨é´éå¼å§ä¹åæ´æ°ä¸æ¬¡æ¶éã
让æä»¬å°è¦ä¼ éç»setIntervalå®çå¿å彿°ç§»å°å ¶èªå·±çç¬ç«å½æ°ä¸ãæä»¬å¯ä»¥å½åè¿ä¸ªå½æ°updateClockãå¨updateClockå¤é¨è°ç¨è¯¥å½æ°setIntervalï¼ç¶åå¨å é¨å次è°ç¨setIntervalãè¿æ ·ï¼æ¶éæ¾ç¤ºå°±æ²¡æå»¶è¿äºã
卿¨çJavaScriptä¸ï¼æ¿æ¢ä¸ºï¼
const timeinterval = setInterval(() => { ... },1000);
æäºè¿ä¸ªï¼
function updateClock(){ const t = getTimeRemaining(endtime); clock.innerHTML = 'days: ' + t.days + '
' + 'hours: '+ t.hours + '
' + 'minutes: ' + t.minutes + '
' + 'seconds: ' + t.seconds; if (t.total <= 0) { clearInterval(timeinterval); } } updateClock(); // run function once at first to avoid delay var timeinterval = setInterval(updateClock,1000);
é¿å æç»é建æ¶é
æä»¬éè¦ä½¿æ¶éèæ¬æ´é«æãæä»¬åªæ³æ´æ°æ¶éä¸çæ°åï¼è䏿¯æ¯ç§éæ°æå»ºæ´ä¸ªæ¶éãå®ç°æ¤ç®ççä¸ç§æ¹æ³æ¯å°æ¯ä¸ªæ°åæ¾å¨spanæ ç¾ä¸ï¼ç¶åä» æ´æ°è¿äºè·¨åº¦çå 容ã
è¿æ¯HTMLï¼
Days:
Hours:
Minutes:
Seconds:
ç°å¨è®©æä»¬åèè¿äºå ç´ ãå¨clockå®ä¹åéçä½ç½®ä¹åæ·»å 以ä¸ä»£ç
const daysSpan = clock.querySelector('.days'); const hoursSpan = clock.querySelector('.hours'); const minutesSpan = clock.querySelector('.minutes'); const secondsSpan = clock.querySelector('.seconds');
æ¥ä¸æ¥ï¼æä»¬éè¦æ´æ¹updateClockåè½ä»¥åæ´æ°æ°åãæ°ä»£ç å¦ä¸æç¤ºï¼
function updateClock(){ const t = getTimeRemaining(endtime); daysSpan.innerHTML = t.days; hoursSpan.innerHTML = t.hours; minutesSpan.innerHTML = t.minutes; secondsSpan.innerHTML = t.seconds; ... }
æ·»å å导é¶
ç°å¨æ¶éä¸åæ¯ç§é½å¨éå»ºï¼æä»¬è¿æå¦ä¸ä»¶äºè¦åï¼æ·»å å导é¶ãä¾å¦ï¼ä¸æ¯è®©æ¶éæ¾ç¤º7ç§ï¼èæ¯æ¾ç¤º07ç§ãä¸ç§ç®åçæ¹æ³æ¯å¨æ°åçå¼å¤´æ·»å å符串â 0âï¼ç¶ååææå䏤使°åã
ä¾å¦ï¼è¦å¨â secondsâå¼ä¸æ·»å å导é¶ï¼æ¨å¯ä»¥å¯¹æ¤è¿è¡æ´æ¹ï¼
secondsSpan.innerHTML = t.seconds;
对æ¤ï¼
secondsSpan.innerHTML = ('0' + t.seconds).slice(-2);
妿éè¦ï¼æ¨ä¹å¯ä»¥å¨åéåå°æ¶ä¸æ·»å å导é¶ã妿æ¨èµ°äºè¿ä¹è¿ï¼æå!æ¨çæ¶éç°å¨å¯ä»¥æ¾ç¤ºäºã
注æï¼æ¨å¯è½éè¦å¨CodePenä¸åå»âéæ°è¿è¡âæè½å¼å§å计æ¶ã
æ´è¿ä¸æ¥
ä¸é¢çç¤ºä¾æ¼ç¤ºå¦ä½é对æäºç¨ä¾æ©å±æ¶éãå®ä»¬é½æ¯åºäºä¸é¢çå°çåºæ¬ç¤ºä¾ã
èªå¨å®ææ¶é
å设æä»¬å¸ææ¶éæ¾ç¤ºå¨æäºæ¥åï¼è䏿¯å ¶ä»æ¥åãä¾å¦ï¼æä»¬å¯è½ä¼åçä¸ç³»åäºä»¶ï¼å¹¶ä¸ä¸æ³æ¯æ¬¡é½æå¨æ´æ°æ¶éãè¿æ¯æåå®æäºæ çæ¹æ³ã
éè¿å¨CSSä¸å°å ¶display屿§è®¾ç½®ä¸ºéèæ¶énoneãç¶åå°ä»¥ä¸å 容添å å°initializeClock彿°ä¸(以å¼å¤´çè¡ä¹åvar clock)ã䏿¦initializeClockè°ç¨æ¤å½æ°ï¼è¿å°å¯¼è´æ¶éä» æ¾ç¤ºï¼
clock.style.display = 'block';
æ¥ä¸æ¥ï¼æä»¬å¯ä»¥æå®æ¾ç¤ºæ¶éçæ¥æãè¿å°æ¿æ¢deadlineåéï¼
const schedule = [ ['Jul 25 2015', 'Sept 20 2015'], ['Sept 21 2015', 'Jul 25 2016'], ['Jul 25 2016', 'Jul 25 2030'] ];
scheduleæ°ç»ä¸çæ¯ä¸ªå ç´ ä»£è¡¨ä¸ä¸ªå¼å§æ¥æåä¸ä¸ªç»ææ¥æãå¦ä¸æè¿°ï¼å¯ä»¥å æ¬æ¶é´åæ¶åºï¼ä½æ¯æå¨è¿é使ç¨äºç®åçæ¥ææ¥ä¿æä»£ç çå¯è¯»æ§ã
æåï¼å½ç¨æ·å è½½é¡µé¢æ¶ï¼æä»¬éè¦æ£æ¥æ¯å¦å¨æå®çæ¶é´èå´å ã该代ç åºæ¿æ¢å å对该initializeClock彿°çè°ç¨ã
// iterate over each element in the schedule for (var i=0; icurrentMs && currentMs >= startMs ) { initializeClock('clockdiv', endDate); } } schedule.forEach(([startDate, endDate]) => { // put dates in milliseconds for easy comparisons const startMs = Date.parse(startDate); const endMs = Date.parse(endDate); const currentMs = Date.parse(new Date()); // if current date is between start and end dates, display clock if (endMs > currentMs && currentMs >= startMs ) { initializeClock('clockdiv', endDate); } });
ç°å¨ï¼æ¨å¯ä»¥æå宿æ¶éï¼èæ éæå¨æ´æ°ãæ¨å¯ä»¥æ ¹æ®éè¦ç¼©ç代ç ã为äºä¾¿äºé è¯»ï¼æè®©æåå¾åé¿ã
ä»ç¨æ·å°è¾¾èµ·å°è®¡æ¶å¨è®¾ç½®ä¸º10åé
ç¨æ·å°è¾¾æå¼å§ç¹å®ä»»å¡åï¼æå¿ è¦å¨ç»å®çæ¶é´å 设置å计æ¶ãæä»¬å°å¨æ¤å¤å°è®¡æ¶å¨è®¾ç½®ä¸º10åéï¼ä½æ¯æ¨å¯ä»¥ä½¿ç¨ä»»ææ¶é´ã
æä»¬éè¦åçå°±æ¯deadlineç¨è¿ä¸ªæ¿æ¢åéï¼
const timeInMinutes = 10; const currentTime = Date.parse(new Date()); const deadline = new Date(currentTime + timeInMinutes*60*1000);
该代ç å°è±è´¹å½åæ¶é´ï¼å¹¶å¢å ååéãè¿äºå¼å°è½¬æ¢ä¸ºæ¯«ç§ï¼å æ¤å¯ä»¥å°å®ä»¬å å¨ä¸èµ·å¹¶åææ°çæªæ¢æ¥æã
ç°å¨ï¼æä»¬æäºä¸ä¸ªæ¶éï¼å¯ä»¥ä»ç¨æ·å°è¾¾æ¶å¼å§åæ°ååéãéæç©èï¼å°è¯ä¸åçæ¶é´é¿åº¦ã
跨页é¢ä¿ææ¶éè¿åº¦
ææ¶ï¼æå¿ è¦å°æ¶éç¶æä¿ççæ¶é´ä¸ä» éäºå½å页é¢ã妿æä»¬æ³å¨æ´ä¸ªç½ç«ä¸è®¾ç½®10åéç计æ¶å¨ï¼åæä»¬ä¸å¸æå¨ç¨æ·è½¬å°å ¶ä»é¡µé¢æ¶å°å ¶éç½®ã
ä¸ç§è§£å³æ¹æ¡æ¯å°æ¶éçç»ææ¶é´ä¿åå¨cookieä¸ãè¿æ ·ï¼å¯¼èªå°æ°é¡µé¢ä¸ä¼å°ç»ææ¶é´é置为ç°å¨çååéã
è¿æ¯é»è¾ï¼
妿Cookieä¸è®°å½äºæªæ¢æ¥æï¼è¯·ä½¿ç¨è¯¥æªæ¢æ¥æã
妿ä¸åå¨è¯¥cookieï¼å设置ä¸ä¸ªæ°çæªæ¢æ¥æå¹¶å°å ¶åå¨å¨cookieä¸ã
è¦å®ç°è¿ä¸ç¹ï¼è¯·ç¨deadline以ä¸å å®¹æ¿æ¢åéï¼
let deadline; // if there's a cookie with the name myClock, use that value as the deadline if(document.cookie && document.cookie.match('myClock')){ // get deadline value from cookie deadline = document.cookie.match(/(^|;)myClock=([^;]+)/)[2]; } else { // otherwise, set a deadline 10 minutes from now and // save it in a cookie with that name // create deadline 10 minutes from now const timeInMinutes = 10; const currentTime = Date.parse(new Date()); deadline = new Date(currentTime + timeInMinutes*60*1000); // store deadline in cookie for future reference document.cookie = 'myClock=' + deadline + '; path=/; domain=.yourdomain.com'; }
è¿æ®µä»£ç å©ç¨äºcookie忣å表达å¼ï¼å®ä»¬æ¬èº«å°±æ¯åç¬ç主é¢ãå æ¤ï¼æå¨è¿éä¸åèµè¿°ãéè¦æ³¨æçä¸ä»¶äºæ¯ï¼æ¨éè¦æ´æ¹.yourdomain.com为å®é åã
æå ³å®¢æ·ç«¯äºä»¶çéè¦è¦å
JavaScriptæ¥æåæ¶é´æ¯ä»ç¨æ·è®¡ç®æºä¸è·åçãè¿æå³çç¨æ·å¯ä»¥éè¿æ´æ¹è®¡ç®æºä¸çæ¶é´æ¥å½±åJavaScriptæ¶éãå¨å¤§å¤æ°æ åµä¸ï¼è¿æ å ³ç´§è¦ã使¯ï¼å¨æäºè¶ 级ææçæ åµä¸ï¼æå¿ è¦ä»æå¡å¨è·åæ¶é´ãå¯ä»¥ä½¿ç¨ä¸äºPHPæAjaxæ¥å®æï¼è¿ä¸¤è é½è¶ åºäºæ¬æç¨çèå´ã
仿å¡å¨è·åæ¶é´åï¼æä»¬å¯ä»¥ä½¿ç¨æ¬æç¨ä¸çç¸åææ¯æ¥ä½¿ç¨å®ã
å èµ·æ¥
é è¯»å®æ¬æä¸ç示ä¾ä¹åï¼æ¨ç°å¨ç¥éå¦ä½ä» ç¨å è¡åå§JavaScript代ç å建èªå·±çåæ°è®¡æ¶å¨!æä»¬å·²ç»ç ç©¶äºå¦ä½å¶ä½åºæ¬çåæ°æ¶éå¹¶æææ¾ç¤ºå®ãæä»¬è¿ä»ç»äºæ·»å ä¸äºæç¨çéå åè½ï¼å æ¬è®¡åï¼ç»å¯¹æ¶é´åç¸å¯¹æ¶é´ï¼ä»¥å使ç¨Cookieä¿ç页é¢åç«ç¹è®¿é®ä¹é´çç¶æã
宿´ä»£ç
Countdown Clock Countdown Clock
DaysHoursMinutesSeconds

