問題場景:假設某個活動截止時間給定了,現在需要開發一個頁面可以自動刷新距離活動截止時間還剩多少天?
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <!--<meta http-equiv="refresh" content="2">--> <title></title> <script src="http://code.jquery.com/jquery-latest.js"></script> <script type="text/javascript"> $(function(){ //參考:可以通過跨域方式獲取其他服務器的當前時間作為服務器當前時間 var oCity="北京"; //設置城市 $.ajax({ type:"GET", //默認是GET url:"http://api.map.baidu.com/telematics/v3/weather?location=" + oCity + "&output=json&ak=ohA7QHfg0BBrpiY4kyuIAAsD", dataType:"jsonp", success:function(data){ //alert(data.date); }, error:function(jqXHR){ //alert("信息錯誤" + jqXHR.status); } }) }) </script> </head> <body id="bodyId" onload="setTimer()"> <div> <table> <tr> <td width="120px;"><label title="系統當前時間">系統當前時間:</label></td> <td><input id="start" /></td> </tr> <tr> <td width="120px;"><label title="活動截止時間">活動截止時間:</label></td> <td><input id="end" disabled="disabled" value="2018-01-01 00:00:00" /></td> </tr> <tr> <td colspan="2"><p id="p"></p></td> </tr> </table> </div> <script> //時間為一位數時顯示格式為:"0X" function checkTime(i) { if (i < 10) { i = "0" + i; } return i; } //顯示瀏覽器現在的時間 function formatTime(timeVal) { var datePara = new Date(timeVal);//定義日期對象 var yyyy = datePara.getFullYear();//通過日期對象的getFullYear()方法返回年 var MM = datePara.getMonth() + 1;//通過日期對象的getMonth()方法返回月 var dd = datePara.getDate();//通過日期對象的getDate()方法返回日 var hh = datePara.getHours();//通過日期對象的getHours方法返回時 var mm = datePara.getMinutes();//通過日期對象的getMinutes方法返回分 var ss = datePara.getSeconds();//通過日期對象的getSeconds方法返回秒 // 如果分鍾或小時的值小於10,則在其值前加0,比如如果時間是下午3點20分9秒的話,則顯示15:20:09 MM = checkTime(MM); dd = checkTime(dd); hh = checkTime(hh); mm = checkTime(mm); ss = checkTime(ss); //用於保存星期(getDay()方法得到星期編號) var day; if (datePara.getDay() == 0) day = "星期日 " if (datePara.getDay() == 1) day = "星期一 " if (datePara.getDay() == 2) day = "星期二 " if (datePara.getDay() == 3) day = "星期三 " if (datePara.getDay() == 4) day = "星期四 " if (datePara.getDay() == 5) day = "星期五 " if (datePara.getDay() == 6) day = "星期六 " //document.getElementById('start').value = yyyy + "-" + MM + "-" + dd + " " + hh + ":" + mm + ":" + ss + " " + day; //setTimeout('formatTime()', 1000);//每一秒中重新加載formatTime()方法 return yyyy + "-" + MM + "-" + dd + " " + hh + ":" + mm + ":" + ss; //+ " " + day; } //服務器現在的時間(這里只是測試,就用瀏覽器時間代替) var startTime = ''; //活動截止時間endTime(以服務器時間為標准,即給定的時間) var end = ''; var endTime = ''; //活動截止時間(以瀏覽器時間為標准) var browserEndTime = ''; //距離活動結束還剩余的時間(以瀏覽器為標准) var plus = ''; //倒計時 function setTimer() { if (!plus) { //服務器現在的時間(這里只是測試,就用瀏覽器時間代替) startTime = new Date(); $("#start").val(formatTime(startTime)); //活動截止時間endTime(預先給定的值) end = document.getElementById("end").value; endTime = new Date(end); //活動截止時間與當前時間的時間差 plus = endTime - startTime; } else { //距離活動結束還剩余的時間,第二次以后就不需要再計算,直接自減即可 plus -= 1000; //更新當前時間(getTime()獲取時間轉化成毫秒后的數值) startTime = new Date(startTime.getTime() + 1000); $("#start").val(formatTime(startTime)); } var day = parseInt(plus / 1000 / 60 / 60 / 24); var hour = parseInt(plus / 1000 / 60 / 60) - day * 24; var minute = parseInt(plus / 1000 / 60) - parseInt(plus / 1000 / 60 / 60) * 60; var second = parseInt(plus / 1000) - parseInt(plus / 1000 / 60) * 60; // 如果分鍾或小時的值小於10,則在其值前加0,比如如果時間是下午3點20分9秒的話,則顯示15:20:09 day = checkTime(day); hour = checkTime(hour); minute = checkTime(minute); second = checkTime(second); document.getElementById("p").innerHTML = "距離活動截止,還剩" + day + "天" + hour + "時" + minute + "分" + second + "秒"; if (plus <= 1) { clearInterval(id); } } //每秒循環一次,刷新活動截止時間與當前時間的時間差 var id = setInterval(setTimer, 1000); </script> </body> </html>
注意:實際應用時,當前系統當前時間應該從服務器取(因為客戶端時間可以隨意被修改),然后依次減少!
如可以用C#和webservice實現從返回服務器時間的功能:
using System; using System.Web; namespace WebApplication { /// <summary> /// Handler 的摘要說明 /// </summary> public class Handler : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; context.Response.Write(DateTime.Now); } } }
運行效果:
獲取時間的免費API:
http://cgi.im.qq.com/cgi-bin/cgi_svrtime
http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp
參考:
Ajax調取百度天氣API:http://www.chijianfeng.com/web/Jquery/144.html
利用gihub搭建免費主頁:http://blog.csdn.net/hitwhylz/article/details/42646197
外服頁面參考:http://www.chinavisa.org.cn/chinavisaremind
附:JavaScript 格式化日期參考:
<!DOCTYPE html> <html> <head></head> <body> <div data-icon-lin="dicon" id = "tt"> <span>日期格式:</span> <input id="timeVal" value ="" placeholder="yyyy-MM-dd hh:mm:ss" class="i1" /><br/> <span>格式化后:</span> <input id="formatVal" value = "" class="i1" /> </div> <div data-pic="picon"> <input type="button" value="格式化" onclick="textTime()" /> </div> <script type="text/javascript"> //時間格式化 Date.prototype.format = function (format) { /* * eg:format="yyyy-MM-dd hh:mm:ss"; */ if (!format) { format = "yyyy-MM-dd hh:mm:ss"; } var o = { "M+": this.getMonth() + 1, // month "d+": this.getDate(), // day "h+": this.getHours(), // hour "m+": this.getMinutes(), // minute "s+": this.getSeconds(), // second "q+": Math.floor((this.getMonth() + 3) / 3), // quarter "S": this.getMilliseconds() // millisecond }; if (/(y+)/.test(format)) { format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); } for (var k in o) { if (new RegExp("(" + k + ")").test(format)) { format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); } } return format; }; function textTime(){ var valTime = document.getElementById("timeVal"); var dt = new Date(); var formatVal = document.getElementById("formatVal"); formatVal.value = dt.format(valTime.value); } </script> </body> </html>
頁面輸出:
附加:
jQuery 實現:根據 Url 路由信息給當前菜單添加選中樣式
注意:如果url被重寫或被隱藏就無法讀取到正確到頁面地址信息,此方法就無效
$(function () { var url = window.location; var element = $('ul.sub-menu a').filter(function () { return this.href == url || url.href.indexOf(this.href) == 0; }).parent().addClass('active').parent().parent(); if (element.is('li')) { element.addClass('active'); element.siblings('li.start').removeClass('active'); } });