浏览器Bug在输入上显示时间文本

时间:2015-05-09 22:50:00

标签: javascript jquery

我正在处理以下谜题,我无法理解为什么会这样。

我有以下[我相信]相当于javascript代码的部分,但是一个不能按预期工作(请注意Console.Log):

一次更新用户界面,然后无意中停止更新:http://jsfiddle.net/silentwarrior/1m0v6oj1/

    jQuery(function () {
    var isWorking = true;
    if (isWorking) {
        var timeEnd = 1431220406000; // generated from php
        var timeNow = 1431210557000; // generated from php
        var counter = 1;
        var t = "";
        setInterval(function () {
            try {
                var c = timeEnd - timeNow - counter;
                console.log(c);
                var d = new Date(c);
                if (c <= 1) {
                    window.location.href = window.location.href;
                    return;
                }
                t = "";
                if (d.getHours() > 0) {
                    t += d.getHours() + "h ";
                }
                if (d.getMinutes() > 0) {
                    t += d.getMinutes() + "m ";
                }
                t += d.getSeconds();
                jQuery("#factory_start_prod").val("Working ... " + t + "s left");
                counter = counter + 1;
            } catch (e) {

            }
        }, 1000);
    }
   });

按预期不断更新用户界面:http://jsfiddle.net/silentwarrior/n3gkum2e/

jQuery(function () {
    var isWorking = true;
    if (isWorking) {
        var timeEnd = 1431220406000;
        var timeNow = 1431210557000;
        var counter = 1;
        var t = "";
        setInterval(function () {
            try {
                var c = timeEnd - Date.now();
                console.log(c);
                var d = new Date(c);
                if (c <= 1) {
                    window.location.href = window.location.href;
                    return;
                }
                t = "";
                if (d.getHours() > 0) {
                    t += d.getHours() + "h ";
                }
                if (d.getMinutes() > 0) {
                    t += d.getMinutes() + "m ";
                }
                t += d.getSeconds();
                jQuery("#factory_start_prod").val("Working ... " + t + "s left");
                counter = counter + 1;
            } catch (e) {

            }
        }, 1000);
    }
});

彼此唯一的区别是,工作的那个使用Date.now()来获取当前时间戳,而另一个使用预先建立的时间戳。

为什么一个示例会正确更新输入中的文本而另一个不会?

PS:对我来说,使用生成的时间戳代替Date.now()非常重要,以便在计算剩余时间时不依赖于用户系统。

1 个答案:

答案 0 :(得分:1)

您的第一个示例正在运行,但是每次迭代时,您只需从时间戳值中减去1,这相当于1ms。因此,除非您等待真正长时间,否则价值永远不会改变。您需要在每次迭代时将counter增加1000一秒钟才能计算:

counter = counter + 1000;

Updated fiddle