Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Facebook 设置超时不准确,仅适用于鼠标向下_Facebook_Settimeout_Mousedown - Fatal编程技术网

Facebook 设置超时不准确,仅适用于鼠标向下

Facebook 设置超时不准确,仅适用于鼠标向下,facebook,settimeout,mousedown,Facebook,Settimeout,Mousedown,我对设置超时有问题 在所有主流浏览器中,它都可以正常工作,但在IE中却不行。。。 我正在创建一个facebook应用程序-拼图。当玩家按下开始按钮时,计时器开始计算他玩一场游戏的时间。 一开始我用setInterval来增加计时器,但在facebook脚本的配合下,它在游戏结束时延迟了大约2秒。然后我在stackoverflow上发现了提高计时器准确性的技巧: 同样,如果没有facebook,它工作得很好,没有延迟。facebook仍然有延迟。 现在来看看您可能感兴趣的信息: 当用户单击开始时,

我对设置超时有问题

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

我现在有两个问题:

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

  • 在IE游戏中,只有当用户按下鼠标时,它才起作用…:/

  • 为了拖动谜题,我使用jQuery拖放插件。
    至少非常有用的信息是如何实现精确的计时器。

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


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

    您可以使用jQuery onReady设置开始时间,并每隔一个周期运行一个计时器(例如)0.5秒轮询开始时间和当前时间之间的差异,以运行计时器。如果在脚本中内联设置开始时间,则无法保证它何时执行,尤其是在使用多个JS SDK时。@Connor感谢您的回答:)通过“您可以使用jQuery onReady”,您的意思是我应该将脚本放入$(document).ready(function(){…})?我的所有脚本(JSSDK除外)都在页面底部,所以它们都是在所有DOM元素之后加载的,但我不确定我是否理解您的意思。您建议每0.5s运行一次计时器,正如您在代码中看到的,我每100ms运行一次计时器来计算它,所以我认为它更好。有没有办法“切断”计时器,这样它就不会干扰FBJSSDK和我的拖放操作?或者有没有更好的方法来实现我想要的,但我不知道?jQuery部分是正确的。我将根据上面增加的信息添加其余部分作为可能的答案。太好了,谢谢你的帮助!我不知道这个事实,尽管我在底部有脚本,但它可能不会像你说的那样运行。我也像你说的那样修改了我的定时器功能。现在,如果脚本延迟并且计时器在一段时间内没有改变数字,“unlag”数字之后显示正确的数字,而不仅仅是+1秒。正如我现在看到的,这是一个非常简单的解决方案:)再次感谢您的帮助!注意:我注意到事实上并不是FBJSSDK导致了速度的减慢,而是拖放插件。