0

我有 setTimeout 的问题。

在所有主要浏览器中它都可以正常工作,但在 IE 中却不行……我正在创建一个 facebook 应用程序拼图。当玩家按下开始按钮时,计时器开始计算他玩一局游戏的时间。一开始我使用 setInterval 来增加计时器,但在 facebook 脚本的配合下,它在游戏结束时延迟了大约 2 秒。然后我在 stackoverflow 上发现了提高计时器准确性的技巧:setInterval 计时慢慢偏离保持准确 再次 - 没有 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个问题:

  1. 时间不准确,在IE中甚至可以相差7秒!

  2. 在游戏期间的 IE 中,它仅在用户按下鼠标时才有效...:/

要拖动拼图,我使用 jQuery 拖放插件。至少非常有用的信息将是如何实现准确的计时器。

4

1 回答 1

0

您应该将脚本放在 jQuery 的 ready 函数中,而不是放在页面底部,因为 Facebook SDK 是异步加载的,如果在页面底部启动它们可能会影响定时执行。

至于时间,您会在 IE7 中看到 15 毫秒到 45 毫秒之间的不准确,具体取决于页面上的其他 JS 执行。因此,您的 100 毫秒超时会严重漂移。最好记录一个开始时间并建立一个比需要的轮询频率更高的计时器,并在每个周期中比较开始时间和“现在”以确定下一步该做什么。

于 2012-05-29T21:25:28.533 回答