用 jQuery 實現簡單倒計時功能


問題場景:假設某個活動截止時間給定了,現在需要開發一個頁面可以自動刷新距離活動截止時間還剩多少天?

<!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');
    }
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM