【问题标题】:What is the problem in this timer [JS]这个计时器有什么问题[JS]
【发布时间】:2011-04-04 19:17:31
【问题描述】:

这个定时器有什么问题[JS]

<script type="text/javascript">

    var remain = "14:14";
    setInterval ("timer()", 660);

    function timer(){

        var remainM = parseInt(remain.split(":")[0]);
        var remainS = parseInt(remain.split(":")[1]);

        //document.getElementById("hello").innerHTML = parseInt(remainS);

        if (remainS==0) {
            if (remainM==0) {

            } else {
                remainM = parseInt(remainM) - 1;
                remainS = 59;
            }
        } else {
            remainS = parseInt(remainS) - 1;
        }

        var remainSr = String(remainS);
        var remainMr = String(remainM);

        if (parseInt(remainS)<=9) {remainSr = "0" + String(remainS);}
        if (parseInt(remainM)<=9) {remainMr = "0" + String(remainM);}

        remain = String(remainMr) + ":" + String(remainSr);
        document.getElementById("hello").innerHTML = remain;

    }

</script>

从 14:09 跳到 13:59

【问题讨论】:

    标签: javascript time timer setinterval


    【解决方案1】:

    忽略parseInt的第二个参数是历史错误。

    查看这篇文章:http://www.devguru.com/technologies/ecmascript/quickref/parseint.html

    试试这个版本:

    <script type="text/javascript">
    var remain = "14:14";
    setInterval("timer()", 660);
    
    function timer() {
        var remainM = parseInt(remain.split(":")[0], 10);
        var remainS = parseInt(remain.split(":")[1], 10); 
        if (remainS == 0) {
            if (remainM == 0) {} else {
                remainM = parseInt(remainM) - 1;
                remainS = 59;
            }
        } else {
            remainS = parseInt(remainS) - 1;
        }
        var remainSr = String(remainS);
        var remainMr = String(remainM);
        if (parseInt(remainS) <= 9) {
            remainSr = "0" + String(remainS);
        }
        if (parseInt(remainM) <= 9) {
            remainMr = "0" + String(remainM);
        }
        remain = String(remainMr) + ":" + String(remainSr);
        document.getElementById("hello").innerHTML = remain;
    }
    </script> 
    

    【讨论】:

    • Number() 可以避免这些问题。
    【解决方案2】:

    您需要在parseInt 中指定基数。如果您执行parseInt("09"),您要求解析八进制数 9,这是一个错误。见parseInt documentation on MDC

    【讨论】:

      【解决方案3】:

      parseInt("09") 返回 0。如果您将其更改为 parseFloatparseInt("09", 10),它将起作用。

      【讨论】:

        【解决方案4】:

        其他人已经解决了直接的问题——您不小心将数字视为八进制而不是十进制——但更深层次的问题是您将数字存储为字符串。不断地与字符串相互转换是令人费解且容易出错的。更好的设计是将时间存储为两个数字,并具有将这些数字按需转换为字符串的功能。这是一个将数字和它们的字符串表示分开的版本:

        var remain = {
            mins: 14, 
            secs: 14,
            toString: function () {
                var pad = function(num) { return (num < 10 ? "0" : "") + num; };
                return pad(this.mins) + ":" + pad(this.secs);
            }
        };
        
        setInterval (timer, 660);
        
        function timer() {
            if (remain.secs === 0) {
                if (remain.mins > 0) {
                    remain.mins -= 1;
                    remain.secs = 59;
                }
            } else {
                remain.secs -= 1;
            }
            document.document.getElementById("hello").innerHTML = remain;
        }
        

        【讨论】:

        • +1。天哪,这几乎就是我刚刚准备发布的答案。一直到添加一个调用 pad 函数的 toString 函数。这是 erie。
        【解决方案5】:

        parseInt() 方法实际上返回它找到的第一个整数,因此当您期望 9 时,您会从 '09' 返回 0。尝试在那里使用 parseFloat() 方法,您应该会很成功。它将返回您所期望的“9”。我希望这会有所帮助!

        【讨论】:

        • 它不像你说的那样工作,parseInt('09') 返回零,因为前导零(在大多数浏览器中)使它将数字视为八进制。由于八进制中不存在“09”(没有 9),因此 parseInt 返回零。将字符串转换为数字的更常见方法是一元 +,例如x = +t,或使用 Number 作为函数,例如x = 数字(t)
        【解决方案6】:
        <!DOCTYPE html>
        <html>
        <body>
        <button onclick="Timer()">Try it</button>
        
        <script>
        function Timer() {
            var sec=0;
            var mm =0;
            setInterval(function(){
                    if(sec<10){
                       if(mm>=10) {
                          document.getElementById('p1').innerHTML= mm + ":"+ "0"+sec;
                       }
                       else {
                                          document.getElementById('p1').innerHTML= "0"+mm + ":"+ "0"+sec;
                                       }
                                       sec = sec+1;                             
                    }
                    else if(sec >=10 && sec <= 59) {
                       if(mm>=10) {
                          document.getElementById('p1').innerHTML= mm + ":"+ sec;
                       }
                       else {
                                          document.getElementById('p1').innerHTML= "0"+mm + ":"+ sec;
                                       } 
                                       sec = sec+1;
                                    }
                                    else if(sec==60) {
                                             sec=0;
                                             mm = mm+1;
                                             if(mm>=10) {
                                                document.getElementById('p1').innerHTML= mm + ":"+ "0"+sec;
                                             }
                                             else {
                                                document.getElementById('p1').innerHTML= "0"+mm + ":"+ "0"+sec;
                                             }
                                       sec = sec+1;            
                                    }
                        },1000);
        }
        </script>
        <p id="p1"></p>
        </body>
        </html>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-26
          • 1970-01-01
          • 2019-10-31
          • 1970-01-01
          相关资源
          最近更新 更多