【问题标题】:not accurate setTimeout and it works only on mousedown不准确的setTimeout,它只适用于mousedown
【发布时间】: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 个问题:

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

  2. 在游戏期间在 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


【解决方案1】:

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

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

【讨论】:

  • 太好了,感谢您的帮助!我不知道这个事实,尽管我在底部有脚本,但它可能不会像你所说的那样运行。我还修改了我的定时器功能,就像你说的那样。现在,如果脚本滞后并且计时器在一段时间内没有更改数字,则在“取消滞后”数字后显示正确的数字,而不仅仅是 +1 秒。正如我现在所看到的,这是非常简单的解决方案:) 再次感谢您的帮助!注意:我注意到实际上不是FB JS SDK导致速度变慢,而是拖放插件。
猜你喜欢
  • 2015-07-02
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多