不准确的setTimeout,它只适用于mousedown

时间:2012-05-29 11:00:16

标签: facebook settimeout mousedown

我遇到setTimeout问题。

在所有主流浏览器中它工作正常但不在IE中... 我正在创建一个facebook app-puzzle。当玩家按下开始按钮时,计时器开始计算他玩一个游戏的时间。 一开始我使用setInterval来增加计时器,但是在facebook脚本的配合下,它在游戏结束时延迟了约2秒。然后我发现stackoverflow技巧来提高计时器的准确性:setInterval timing slowly drifts away from staying accurate 再次 - 没有Facebook它工作正常,没有显示延迟。有了Facebook,它仍然有延迟。 现在要凝结您可能感兴趣的信息: 当用户单击“开始”时,我将新日期创建为startTime。 当用户结束游戏脚本创建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);

我现在有两个问题:

  1. 不准确的时间,在IE中它甚至可以是7秒的差异!

  2. IE中的
  3. 在游戏过程中只有当用户有mousedown时才有效...:/

  4. 要拖动谜题,我使用jQuery drag& drop plugin。 至少非常有用的信息将是如何实现准确的计时器。

1 个答案:

答案 0 :(得分:0)

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

至于时间安排,根据页面上的其他JS执行情况,你会在IE7中看到15ms到45ms之间的不准确度。由于这个原因,你的100ms超时时间会很糟糕。最好记录一个开始时间并建立一个轮询频率高于所需的定时器,并在每个周期的开始时间和“现在”之间进行比较,以确定下一步该做什么。