Opera中的Javascript计时器错误

时间:2014-01-05 09:54:27

标签: javascript opera

这是一个简单的益智游戏,使用html 5拖放将移动范围移动到正确的位置。计时器在第一次拖动时启动(功能拖动(e)),并在保留区域中没有剩余空间时停止(未显示)。

(旁边的问题:有没有一种标准的方法来美化我想要的(m)m:ss定时器输出,还是我必须像我一样继续?)

为什么timer()函数在chrome和firefox中完美运行,但是在8秒内Opera重置了几秒?如果我不尝试美化秒并使用注释掉的线代替它,那就完美了。

祝你好运!

var timerOn = false;

function drag(e) {
  if (timerOn == false) {
    timerOn = window.setInterval(function(){ timer() }, 1000);
  }
...
}

function timer() {
  var content = document.getElementById("timer").textContent.split(":");
  if (parseInt(content[1]) == 59) {
    content[0] = (parseInt(content[0]) + 1).toString();
    content[1] = "00";
  }
  else {
    var s = parseInt(content[1]) + 1;
    content[1] = (s < 10 ? "0" : "") + s.toString();
    //~ content[1] =  s.toString();
  }
  document.getElementById("timer").textContent = content[0] + ":" + content[1];
}

....

<span id="timer">0:00</span>

1 个答案:

答案 0 :(得分:1)

因为某些浏览器会扩展JavaScript的parseInt以将前缀0视为“八进制”,而08是一个无效的八进制数。

在你使用parseInt的各个地方,给它第二个参数( radix - 例如,数字基数 - 要使用),例如parseInt(str, 10)。 (由于这个原因,这一般是一个好主意。)

我很惊讶您仍然在最新的浏览器中发现这种行为,因为三年半前发布的ECMAScript5规范明确禁止以这种方式扩展parseInt,在Annex E - Additions and Changes in the 5th Edition that Introduce Incompatibilities with the 3rd Edition中注明:

  

15.1.2.2:函数parseInt的规范不再允许实现将以0字符开头的字符串视为八进制值。

...我认为§B.1.1 - Additional Syntax - Numeric Literals不适用于parseInt