【发布时间】:2012-05-29 11:00:16
【问题描述】:
setTimeout 有问题。
在所有主流浏览器中都可以正常工作,但在 IE 中则不行... 我正在创建一个 facebook 应用程序-拼图。当玩家按下开始按钮时,计时器开始计算他玩一局游戏的时间。 一开始我使用 setInterval 来增加计时器,但在 facebook 脚本的配合下,它在游戏结束时延迟了大约 2 秒。然后我发现了 stackoverflow 技巧来提高计时器的准确性:setInterval timing slowly drifts away from staying accurate 再一次 - 没有 facebook 它运行良好,没有显示延迟。使用 facebook,它仍然有延迟。 现在汇总您可能感兴趣的信息: 当用户单击开始时,我创建新日期作为开始时间。 当用户结束游戏脚本创建 finalTime 新日期,然后减去 finalTime - startTime。
代码中有setTimeout:
(...)
f : function() {
var sec_time = Math.floor((puzzle.nextAt - puzzle.startTime)/1000);
$('.timer').html(sec_time);
if (!puzzle.startTime) {
puzzle.startTime = new Date().getTime();
puzzle.nextAt = puzzle.startTime;
$('.timer').html('0');
}
puzzle.nextAt += 100;
puzzle.to = setTimeout(puzzle.f, puzzle.nextAt - new Date().getTime());
}
(...)
当用户将最后一块拼图放在正确的位置时,我调用 clearTimeout(puzzle.to);
我现在有 2 个问题:
时间不准确,在IE下甚至可以相差7秒!
在游戏期间在 IE 中它仅在用户按下鼠标时才有效...:/
要拖动拼图,我使用 jQuery 拖放插件。 至少非常有用的信息将是如何实现准确的计时器。
【问题讨论】:
-
您可以使用 jQuery onReady 设置您的开始时间,并每隔(例如)0.5 秒运行一次计时器来轮询开始时间和当前时间之间的差异,以运行计时器。如果在脚本中内联设置开始时间,则无法保证它何时执行,尤其是在使用多个 JS SDK 时。
-
@Connor 感谢您的回复 :) '您可以使用 jQuery onReady' 您的意思是我应该将脚本放入 $(document).ready(function() {...}) ; ?我的所有脚本(JS SDK 除外)都位于页面底部,因此它们是在所有 DOM 元素之后加载的,但我不确定我是否理解您正确。您建议每 0.5 秒运行一次计时器,正如您在代码中看到的那样,我每 100 毫秒运行一次计时器来计算它,所以我认为它更好。有没有办法“切断”那个计时器,这样它就不会干扰 FB JS SDK 和我的拖放操作?或者有什么更好的方法来实现我想要的,但我不知道?
-
jQuery 部分是正确的。我将根据上面增加的信息添加其余的作为可能的答案。
标签: facebook settimeout mousedown