<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    于吉吉的技術博客

    建造高性能門戶網

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      65 隨筆 :: 6 文章 :: 149 評論 :: 0 Trackbacks

    最近做了一個房產的秒殺,團購的電子商務網站(房子也有秒殺,出手不小啊),其中里面有一個秒殺的倒計時展示,主要是判斷當前時間距離秒殺開始還有多少時間,還有秒殺開始和秒殺結束的各種展示。
    其中最主要的一點就是所謂的當前時間不能使用瀏覽器通過new Date()獲取的客戶端時間,這樣只要用戶修改了自己的機器時間那么倒計時就會亂透了,所以這個當前時間必須使用的是服務器時間,所以采用的是靜態緩存頁面所以這個當前時間使用ajax方式進行獲取


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
    <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <meta http-equiv="Content-Language" content="zh-CN" />
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
    <meta content="all" name="robots" />
    <meta name="author" content="" />
    </head>
    <body onload='start()'>
    .
    距活動開始還有:<span id="sk_time"></span> <!-- 這個是倒計時的顯示 -->
    .
    <br/>
    <span id="wyz">
    <span class="btn_02">&nbsp;&nbsp;參加秒殺!!!&nbsp;&nbsp;</span> <!-- 這個是秒殺按鈕,倒計時為0時會變成可以秒殺的樣式 -->
    </span>
    .

    <script type="text/javascript">
    var msbegintime = "1323446400000"//這個是活動開始的時間戳
    var msendtime = "1325174400000"//這個是活動結束的時間戳

    function start(){
        callBackServerTime(
    "sk_time""wyz", msbegintime, msendtime);
    }

    //_showtimediv:時間顯示區域,_showqdiv:狀態顯示區域
    //
    這個向服務器發送一個ajax請求,服務器返回服務器當前的時間戳,也就是xmlobj.responseText是一個服務器的時間戳
    function callBackServerTime(_showtimediv, _showqdiv, _ms_begintime, _ms_endtime) {
        
    var now = new Date();
        
    var urlstr = "random=" + Math.round(Math.random() * 10000000);
        
    var ajaxobj = new AJAXRequest;    // 創建AJAX對象
        ajaxobj.method = "GET";   // 設置請求方式為GET
        ajaxobj.url = "/gz/source/getServerTime.do?" + urlstr; //注意ajax的跨域問題
        ajaxobj.callback = function(xmlobj) {
            
    //ShowQTime(xmlobj.responseText, _showtimediv, _showqdiv, _ms_begintime, _ms_endtime, _tryid,sourceid);
            ShowQTime( _showtimediv, _showqdiv,"1323158067288", _ms_begintime, _ms_endtime);     // 這里使用靜態數字替代 xmlobj.responseText 方便測試
        }
        ajaxobj.send();    
    // 發送請求
    }

    //動態顯示”秒殺“時間函數
    function ShowQTime(_showtimediv, _showqdiv, _nowtime, _ms_begintime, _ms_endtime) {
        _nowtime 
    = Number(_nowtime);
        
    var timmer = Math.floor((_ms_endtime - _nowtime) / (1000)); 
        
    if (_nowtime >= _ms_begintime && timmer > 0) {;
            
    //秒殺進行中
            document.getElementById(_showtimediv).innerHTML = "<span class='pim_time'>0</span>天<span class='pim_time'>0</span>小時<span class='pim_time'>0</span>分鐘<span class='pim_time'>0</span>秒";
            document.getElementById(_showqdiv).innerHTML 
    = "<span class='btn_01'><a href='/gz/sk/v/'>&nbsp;&nbsp;秒殺開始了!!!&nbsp;&nbsp;</a></span>";
        } 
    else {
            
    //秒殺倒計時
            var nMS = _ms_begintime - _nowtime;  //計算出開始時間和現在時間的時間戳差
            var nD = Math.floor(nMS / (1000 * 60 * 60 * 24));
            
    var nH = Math.floor(nMS / (1000 * 60 * 60)) % 24;
            
    var nM = Math.floor(nMS / (1000 * 60)) % 60;
            
    var nS = Math.floor(nMS / 1000% 60;
            
    var nMS = Math.floor(nMS / 100% 10;
            
    if (nD >= 0) {
                
    var _timestr = "";
                
    var snd = nD.toString();
                
    if (snd.length == 1) {
                    snd 
    = "0" + snd;
                }
                _timestr 
    += "<span class='pim_time'>" + snd.substring(01+ snd.substring(12+"</span>天";
                
    var snH = nH.toString();
                
    if (snH.length == 1) {
                    snH 
    = "0" + snH;
                }
                _timestr 
    += "<span class='pim_time'>" + snH.substring(01+ snH.substring(12+"</span>小時";
                
    var snM = nM.toString();
                
    if (snM.length == 1) {
                    snM 
    = "0" + snM;
                }
                _timestr 
    += "<span class='pim_time'>" + snM.substring(01+ snM.substring(12+"</span>分鐘";
                
    var snS = nS.toString();
                
    if (snS.length == 1) {
                    snS 
    = "0" + snS;
                }
                _timestr 
    += "<span class='pim_time'>" + snS.substring(01+ snS.substring(12+"</span>秒";
                document.getElementById(_showtimediv).innerHTML 
    = _timestr;
            }
    else {
                
    //秒殺結束
                 document.getElementById(_showtimediv).innerHTML = "<span class='pim_time'>0</span>天<span class='pim_time'>0</span>小時<span class='pim_time'>0</span>分鐘<span class='pim_time'>0</span>秒";
                 document.getElementById(_showqdiv).innerHTML 
    = "<span class='btn_01'><a href='/gz/sk/v/'>&nbsp;&nbsp;秒殺結束了!!!&nbsp;&nbsp;</a></span>";
            }
        }
        
    //注意 (_nowtime + 1000) 增加 1 秒
        setTimeout("ShowQTime('" + _showtimediv + "','" + _showqdiv + "','" + (_nowtime + 1000+ "','" + _ms_begintime + "','" + _ms_endtime + "')"1000);
    }

    function AJAXRequest() {
        
    var xmlObj = false;
        
    var CBfunc,ObjSelf;
        ObjSelf
    =this;
        
    try { xmlObj=new XMLHttpRequest; }
        
    catch(e) {
            
    try { xmlObj=new ActiveXObject("MSXML2.XMLHTTP"); }
            
    catch(e2) {
                
    try { xmlObj=new ActiveXObject("Microsoft.XMLHTTP"); }
                
    catch(e3) { xmlObj=false; }
            }
        }
        
    if (!xmlObj) return false;
        
    this.method="POST";
        
    this.url;
        
    this.async=true;
        
    this.content="";
        
    this.callback=function(cbobj) {return;}
        
    this.send=function() {
            
    if(!this.method||!this.url||!this.async) return false;
            xmlObj.open (
    this.method, this.url, this.async);
            
    if(this.method=="POST") xmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xmlObj.onreadystatechange
    =function() {
                
    if(xmlObj.readyState==4) {
                    
    if(xmlObj.status==200) {
                        ObjSelf.callback(xmlObj);
                    }
                }
            }
            
    if(this.method=="POST") xmlObj.send(this.content);
            
    else xmlObj.send(null);
        }
    }
    </script>

    </body>
    </html>
    posted on 2011-12-06 16:22 陳于喆 閱讀(4999) 評論(7)  編輯  收藏 所屬分類: web開發

    評論

    # re: javascript 實現'秒殺,團購'倒計時展示的記錄 2011-12-07 08:49 tb
    不錯的例子  回復  更多評論
      

    # re: javascript 實現'秒殺,團購'倒計時展示的記錄 2011-12-07 09:21 HiMagic!
    用了jQuery怎么還自己封ajax。有沒有測過誤差堆積,就是說當頁面跑上十幾分鐘后,看看時鐘是否還正確。  回復  更多評論
      

    # re: javascript 實現'秒殺,團購'倒計時展示的記錄 2011-12-07 14:42 TBW
    這個真不錯哦  回復  更多評論
      

    # re: javascript 實現'秒殺,團購'倒計時展示的記錄 2011-12-07 17:06 雪地靴
    難怪那么多團購網的,是這么回事。  回復  更多評論
      

    # re: javascript 實現'秒殺,團購'倒計時展示的記錄 2011-12-15 17:37 raullf
    很好的東西,哪里用了jquery!  回復  更多評論
      

    # re: javascript 實現'秒殺,團購'倒計時展示的記錄 2012-02-29 11:41 新款女裝
    寫得非常好,沒事的時候學來看看,
    親親網 www.5a77.com
    新款女裝 www.a0a7.com  回復  更多評論
      

    # re: javascript 實現'秒殺,團購'倒計時展示的記錄 2014-04-15 14:16 Mr.Ding
    在其他網站也看到過類似的實現"有沒有測過誤差堆積"確實是個問題,解決方案隔一段時間發ajax獲取一次數據庫當前時間@HiMagic!  回復  更多評論
      

    主站蜘蛛池模板: 精品丝袜国产自在线拍亚洲| 亚洲人成网www| 亚洲av无码专区在线电影天堂| 国产精品色拉拉免费看| 亚洲人成电影福利在线播放| 久久久久国产精品免费网站| 西西人体44rt高清亚洲| 国产精品免费福利久久| 亚洲av不卡一区二区三区| 久久国产色AV免费观看| 久久精品国产亚洲精品2020| xxxxwww免费| 亚洲人成在线中文字幕| 午夜私人影院免费体验区| 亚洲Av永久无码精品黑人| 亚洲免费日韩无码系列| 水蜜桃视频在线观看免费播放高清| 亚洲人成网77777亚洲色| 人妻丰满熟妇无码区免费| 亚洲精品视频在线免费| 24小时日本在线www免费的| 亚洲AV无码一区二区乱子仑| 亚洲精品成人a在线观看| 99久久99这里只有免费的精品| 亚洲大片在线观看| 午夜性色一区二区三区免费不卡视频 | 久久精品国产这里是免费| 亚洲精品午夜久久久伊人| 全免费A级毛片免费看网站| 免费人成动漫在线播放r18 | 国产婷婷高清在线观看免费| 亚洲一级片免费看| 亚洲精品国产成人中文| 国产无遮挡又黄又爽免费视频| 免费无码午夜福利片| 亚洲人成在线播放网站岛国| 国拍在线精品视频免费观看| 免费无码又爽又黄又刺激网站| 亚洲AV无码1区2区久久| 好大好硬好爽免费视频| 四虎影视无码永久免费|