В чем проблема в этом таймере [JS] - PullRequest
0 голосов
/ 04 апреля 2011

В чем проблема с этим таймером [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

Ответы [ 6 ]

3 голосов
/ 04 апреля 2011

Это историческая ошибка, допущенная игнорированием второго параметра 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> 
2 голосов
/ 04 апреля 2011

parseInt("09") возвращает 0. Если вы измените его на parseFloat или parseInt("09", 10), оно будет работать.

2 голосов
/ 04 апреля 2011

Вам необходимо указать основание в parseInt. Если вы делаете parseInt("09"), вы запрашиваете анализ восьмеричного числа 9, что является ошибкой См. Документацию parseInt для MDC

.
1 голос
/ 04 апреля 2011

Другие рассмотрели непосредственную проблему - что вы случайно рассматриваете число как восьмеричное, а не десятичное число, но более глубокая проблема заключается в том, что вы храните числа как строки.Постоянное преобразование в и из строк извилистое и подверженное ошибкам.Лучшим вариантом было бы хранить время в виде двух чисел и иметь функцию, которая преобразует эти числа в строку по требованию.Вот версия, которая хранит числа и их строковое представление отдельно:

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;
}
0 голосов
/ 14 октября 2014
<!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>
0 голосов
/ 04 апреля 2011

Метод parseInt() фактически возвращает ПЕРВОЕ целое число, которое он находит, поэтому вы возвращаете 0 из '09', когда ожидаете 9. Попробуйте использовать там метод parseFloat(), и вы должны быть золотыми. Он вернет «9», что вы ожидаете. Надеюсь, это поможет !!

...