于吉吉的技術(shù)博客

          建造高性能門(mén)戶網(wǎng)

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            65 隨筆 :: 6 文章 :: 149 評(píng)論 :: 0 Trackbacks

          最近做了一個(gè)房產(chǎn)的秒殺,團(tuán)購(gòu)的電子商務(wù)網(wǎng)站(房子也有秒殺,出手不小啊),其中里面有一個(gè)秒殺的倒計(jì)時(shí)展示,主要是判斷當(dāng)前時(shí)間距離秒殺開(kāi)始還有多少時(shí)間,還有秒殺開(kāi)始和秒殺結(jié)束的各種展示。
          其中最主要的一點(diǎn)就是所謂的當(dāng)前時(shí)間不能使用瀏覽器通過(guò)new Date()獲取的客戶端時(shí)間,這樣只要用戶修改了自己的機(jī)器時(shí)間那么倒計(jì)時(shí)就會(huì)亂透了,所以這個(gè)當(dāng)前時(shí)間必須使用的是服務(wù)器時(shí)間,所以采用的是靜態(tài)緩存頁(yè)面所以這個(gè)當(dāng)前時(shí)間使用ajax方式進(jìn)行獲取


          <!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()'>
          .
          距活動(dòng)開(kāi)始還有:<span id="sk_time"></span> <!-- 這個(gè)是倒計(jì)時(shí)的顯示 -->
          .
          <br/>
          <span id="wyz">
          <span class="btn_02">&nbsp;&nbsp;參加秒殺!!!&nbsp;&nbsp;</span> <!-- 這個(gè)是秒殺按鈕,倒計(jì)時(shí)為0時(shí)會(huì)變成可以秒殺的樣式 -->
          </span>
          .

          <script type="text/javascript">
          var msbegintime = "1323446400000"//這個(gè)是活動(dòng)開(kāi)始的時(shí)間戳
          var msendtime = "1325174400000"//這個(gè)是活動(dòng)結(jié)束的時(shí)間戳

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

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

          //動(dòng)態(tài)顯示”秒殺“時(shí)間函數(shù)
          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) {;
                  
          //秒殺進(jìn)行中
                  document.getElementById(_showtimediv).innerHTML = "<span class='pim_time'>0</span>天<span class='pim_time'>0</span>小時(shí)<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;秒殺開(kāi)始了!!!&nbsp;&nbsp;</a></span>";
              } 
          else {
                  
          //秒殺倒計(jì)時(shí)
                  var nMS = _ms_begintime - _nowtime;  //計(jì)算出開(kāi)始時(shí)間和現(xiàn)在時(shí)間的時(shí)間戳差
                  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>小時(shí)";
                      
          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 {
                      
          //秒殺結(jié)束
                       document.getElementById(_showtimediv).innerHTML = "<span class='pim_time'>0</span>天<span class='pim_time'>0</span>小時(shí)<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;秒殺結(jié)束了!!!&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 陳于喆 閱讀(4995) 評(píng)論(7)  編輯  收藏 所屬分類: web開(kāi)發(fā)

          評(píng)論

          # re: javascript 實(shí)現(xiàn)'秒殺,團(tuán)購(gòu)'倒計(jì)時(shí)展示的記錄 2011-12-07 08:49 tb
          不錯(cuò)的例子  回復(fù)  更多評(píng)論
            

          # re: javascript 實(shí)現(xiàn)'秒殺,團(tuán)購(gòu)'倒計(jì)時(shí)展示的記錄 2011-12-07 09:21 HiMagic!
          用了jQuery怎么還自己封ajax。有沒(méi)有測(cè)過(guò)誤差堆積,就是說(shuō)當(dāng)頁(yè)面跑上十幾分鐘后,看看時(shí)鐘是否還正確。  回復(fù)  更多評(píng)論
            

          # re: javascript 實(shí)現(xiàn)'秒殺,團(tuán)購(gòu)'倒計(jì)時(shí)展示的記錄 2011-12-07 14:42 TBW
          這個(gè)真不錯(cuò)哦  回復(fù)  更多評(píng)論
            

          # re: javascript 實(shí)現(xiàn)'秒殺,團(tuán)購(gòu)'倒計(jì)時(shí)展示的記錄 2011-12-07 17:06 雪地靴
          難怪那么多團(tuán)購(gòu)網(wǎng)的,是這么回事。  回復(fù)  更多評(píng)論
            

          # re: javascript 實(shí)現(xiàn)'秒殺,團(tuán)購(gòu)'倒計(jì)時(shí)展示的記錄 2011-12-15 17:37 raullf
          很好的東西,哪里用了jquery!  回復(fù)  更多評(píng)論
            

          # re: javascript 實(shí)現(xiàn)'秒殺,團(tuán)購(gòu)'倒計(jì)時(shí)展示的記錄 2012-02-29 11:41 新款女裝
          寫(xiě)得非常好,沒(méi)事的時(shí)候?qū)W來(lái)看看,
          親親網(wǎng) www.5a77.com
          新款女裝 www.a0a7.com  回復(fù)  更多評(píng)論
            

          # re: javascript 實(shí)現(xiàn)'秒殺,團(tuán)購(gòu)'倒計(jì)時(shí)展示的記錄 2014-04-15 14:16 Mr.Ding
          在其他網(wǎng)站也看到過(guò)類似的實(shí)現(xiàn)"有沒(méi)有測(cè)過(guò)誤差堆積"確實(shí)是個(gè)問(wèn)題,解決方案隔一段時(shí)間發(fā)ajax獲取一次數(shù)據(jù)庫(kù)當(dāng)前時(shí)間@HiMagic!  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 望都县| 弋阳县| 顺昌县| 道真| 景宁| 大关县| 丘北县| 长乐市| 勃利县| 和平县| 台湾省| 延寿县| 嘉峪关市| 海门市| 鄄城县| 彝良县| 贵州省| 彰化市| 乐平市| 长乐市| 东乡县| 平和县| 盘山县| 鄂伦春自治旗| 云和县| 普兰店市| 曲阳县| 且末县| 子洲县| 海丰县| 红安县| 西青区| 始兴县| 女性| 南部县| 张家川| 镇远县| 丰宁| 济源市| 香格里拉县| 新沂市|