循環套定時器——定時器套循環


  最近再改一個項目,里面有個倒計時。類似於商品的秒殺,每個商品都會有一個倒計時,都要顯示在頁面上。當倒計時結束的時候,商品顯示已下架。這個功能是非常簡單的,但是不知道為什么項目會出現時間沒辦法獲取到,導致了,所有的倒計時都顯示underfind。下面是我自己仿照原來程序的代碼:(這段代碼是錯誤的)

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>循環套定時器——定時器套循環</title>
 6     </head>
 7     <body>
 8         <ul id="list">
 9             <!--<li>
10                 <p>到</p>
11                 <span></span>
12                 <p>還剩</p>
13                 <b></b>
14             </li>-->
15         </ul>
16     </body>
17     <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
18     <script type="text/javascript">
19         $.ajax({
20             type: "get",
21             url: "./time.json",
22             async: true,
23             success: function(data) {
24                 console.log(data);
25                 $.each(data.time, function(k, item) {
26                     console.log(item);
27                     $("#list").append("<li>" + "<span>到</span>" + "<span>" + time1(item.endtime) + "</span>" + "<span> 還剩 </span>" + "<b>" + time2(item.endtime) + "</b>" + "</li>")
28                 });
29             }
30         });
31 
32         function time1(time) {
33             //console.log(time);
34             var timecenter = new Date(time);
35             var year = timecenter.getFullYear();
36             var month = timecenter.getMonth() + 1;
37             var date1 = timecenter.getDate();
38             var hour = timecenter.getHours();
39             var min = timecenter.getMinutes();
40             var sec = timecenter.getSeconds();
41             return checkTime(year) + "-" + checkTime(month) + "-" + checkTime(date1) + " " + checkTime(hour) + ":" + checkTime(min) + ":" + checkTime(sec);
42         }
43 
44         function time2(time) {
45             //console.log(time);
46             setInterval(function() {
47                 var now_time = new Date().getTime();
48                 var bet_time = time - now_time;
49                 if(bet_time <= 0) {
50                     return "結束了!"
51                 } else {
52                     var dd = parseInt(bet_time / 60 / 60 / 24, 10); //計算剩余的天數
53                     var hh = parseInt(bet_time / 60 / 60 % 24, 10); //計算剩余的小時數
54                     var mm = parseInt(bet_time / 60 % 60, 10); //計算剩余的分鍾數
55                     var ss = parseInt(bet_time % 60, 10); //計算剩余的秒數
56                     hh = checkTime(hh);
57                     mm = checkTime(mm);
58                     ss = checkTime(ss);
59                     msg = "距離結束" + dd + "" + hh + ":" + mm + ":" + ss;
60                     //$(".psss").eq(index).html('<span class="spans1">' + supportNum + '</span><em class="ems1">' + targetAmount + '</em><i class="is">' + msg + '</i>');
61                     return msg;
62                 }
63             }, 1000)
64         }
65         function checkTime(i) {
66             if(i < 10) {
67                 i = "0" + i;
68             }
69             return i;
70         }
71     </script>
72 </html>

這里面的time.json是為了模仿ajax從后台加載數據!為了大家方便也把這個小json也寫在下面了。

 1 {
 2     "time": [
 3         {
 4             "endtime": 1514995200000
 5         }, {
 6             "endtime": 1515045600000
 7         }, {
 8             "endtime": 1515045660000
 9         }
10     ]
11 }
time.json

這里運行代碼就會發現出了下圖的情況:

  為什么會出現這種原因呢。其實就是循環的進行是一瞬間完成的,但是計時器卻不是這樣的,他是一步步的執行的。

這樣就導致了,我們的定時器還沒有啟動,但是循環已經做完了,導致了咱們顯示的都是錯誤的。

然后就寫了一個定時器,在加載完成之后再進行倒計時循環,參加下面的代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>循環套定時器——定時器套循環</title>
    </head>
    <body>
        <ul id="list">
            <!--<li>
                <p>到</p>
                <span></span>
                <p>還剩</p>
                <b></b>
            </li>-->
        </ul>
    </body>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <script type="text/javascript">
        $.ajax({
            type: "get",
            url: "./time.json",
            async: true,
            success: function(data) {
                ////console.log(data);
                $.each(data.time, function(k, item) {
                    //console.log(item);
                    $("#list").append("<li>" + "<span>到</span>" + "<span>" + time1(item.endtime) + "</span>" + "<span> 還剩 </span>" + "<b>" + time2(item.endtime) + "</b>" + "</li>")
                });
                set_Inter_val1(time_arr);
            }
        });

        function time1(time) {
            ////console.log(time);
            var timecenter = new Date(time);
            var year = timecenter.getFullYear();
            var month = timecenter.getMonth() + 1;
            var date1 = timecenter.getDate();
            var hour = timecenter.getHours();
            var min = timecenter.getMinutes();
            var sec = timecenter.getSeconds();
            return checkTime(year) + "-" + checkTime(month) + "-" + checkTime(date1) + " " + checkTime(hour) + ":" + checkTime(min) + ":" + checkTime(sec);
        }
        var time_arr = [];
        function time2(time) {
            //console.log(time);
            time_arr.push(time);
            //console.log(time_arr);
            //setInterval(function() {
                var now_time = new Date().getTime();
                var bet_time = time - now_time;
                if(bet_time <= 0) {
                    return "結束了!"
                } else {
                    var dd = parseInt(bet_time/1000 / 60 / 60 / 24, 10); //計算剩余的天數
                    var hh = parseInt(bet_time/1000 / 60 / 60 % 24, 10); //計算剩余的小時數
                    var mm = parseInt(bet_time/1000 / 60 % 60, 10); //計算剩余的分鍾數
                    var ss = parseInt(bet_time/1000 % 60, 10); //計算剩余的秒數
                    hh = checkTime(hh);
                    mm = checkTime(mm);
                    ss = checkTime(ss);
                    msg = "距離結束" + dd + "" + hh + ":" + mm + ":" + ss;
                    //$(".psss").eq(index).html('<span class="spans1">' + supportNum + '</span><em class="ems1">' + targetAmount + '</em><i class="is">' + msg + '</i>');
                    return msg;
                }
            //}, 1000)
            //clearInterval(time);
            
        }
        var time = ''
        function set_Inter_val1(time_arr){
             time = setInterval(function(){
                for(var i=0;i<time_arr.length;i++){
                    var now_time = new Date().getTime();
                    var bet_time = time_arr[i] - now_time;
                    if(bet_time <= 0) {
                        $("li").eq(i).find('b').html('結束了');
                    } else {
                        var dd = parseInt(bet_time/1000 / 60 / 60 / 24, 10); //計算剩余的天數
                        var hh = parseInt(bet_time/1000 / 60 / 60 % 24, 10); //計算剩余的小時數
                        var mm = parseInt(bet_time/1000 / 60 % 60, 10); //計算剩余的分鍾數
                        var ss = parseInt(bet_time/1000 % 60, 10); //計算剩余的秒數
                        hh = checkTime(hh);
                        mm = checkTime(mm);
                        ss = checkTime(ss);
                        msg = "距離結束" + dd + "" + hh + ":" + mm + ":" + ss;
                        $("li").eq(i).find('b').html(msg);
                        console.log(msg);
                    }
                }
            },1000)
        }
        function checkTime(i) {
            if(i < 10) {
                i = "0" + i;
            }
            return i;
        }
    </script>
</html>

這樣,等待加載完成之后,然后啟動了定時器,定時器中有循環算時間,然后賦值

最后給大家推薦一篇文章我覺得寫的不錯的文章:https://www.cnblogs.com/hyea/p/5596079.html


免責聲明!

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



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