Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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
Javascript 如何将客户端网页计时器与服务器同步_Javascript_Ajax_Time_Synchronization_Client Side - Fatal编程技术网

Javascript 如何将客户端网页计时器与服务器同步

Javascript 如何将客户端网页计时器与服务器同步,javascript,ajax,time,synchronization,client-side,Javascript,Ajax,Time,Synchronization,Client Side,将网页上的时间与服务器同步的最佳方式是什么 我的网页需要在所有用户同时开始倒计时,并在完全相同的时间结束,以防止任何一个用户有轻微的时间优势 我的问题与此问题类似,但公认的答案有帮助,但不能完全回答我的问题: 我在pageload之后使用Ajax来获取服务器时间,但是我是否保证在15分钟内每个客户端的倒计时都会在完全相同的时间结束 即使计时器准确地测量时间,由于忽略设置间隔的毫秒数,客户端页面之间仍可能存在不到1秒的差异-有没有办法克服这个问题?在现代浏览器中,可以通过为JavaScript变量

将网页上的时间与服务器同步的最佳方式是什么

我的网页需要在所有用户同时开始倒计时,并在完全相同的时间结束,以防止任何一个用户有轻微的时间优势

我的问题与此问题类似,但公认的答案有帮助,但不能完全回答我的问题:

我在pageload之后使用Ajax来获取服务器时间,但是我是否保证在15分钟内每个客户端的倒计时都会在完全相同的时间结束


即使计时器准确地测量时间,由于忽略设置间隔的毫秒数,客户端页面之间仍可能存在不到1秒的差异-有没有办法克服这个问题?

在现代浏览器中,可以通过为JavaScript变量指定时间戳来实现这一点,并使用来计算准确的时间

例如:

var tsp = new Date('Sun Feb 19 2012 17:55:14 GMT+0100 (CET)'); // "Timestamp"

window.onload = function() {
    var performance = window.performance || window.mozPerformance || window.msPerformance || window.webkitPerformance || {};
    tsp.setTime(tsp.getTime() + performance.timing.loadEventStart - performance.timing.navigationStart
    // after window.onload, you're sync with the server

    // Example of timer:
    setInterval(function() {
        tsp.setSeconds(tsp.getSeconds() + 1);
        document.title = tsp.toString();
    }, 1000); // 1000 ms = timer may be off by 500ms.
};
有关此对象的详细信息,请查看。

提供了一个演示。

理想情况下,您的解决方案将涉及服务器发送一个信号,即提交表单同时向所有客户端开放。如果排除使用旧浏览器的用户没有问题,您可以使用。对于这些浏览器,也存在使用长轮询的回退

不过,我不确定WebSocket与PHP的结合情况如何

我只与node JS一起使用过。使用该解决方案,设置服务器端超时并在超时完成时同时通知所有客户机是很简单的。它会自动检测浏览器支持并选择最适合给定浏览器的方法


使用此解决方案,客户端将仅在服务器告知其已准备就绪时才允许提交。只要您提交给的服务器执行验证,您就应该可以了。

接受的答案很好,在我编写库来解决此问题时,这对我很有启发。该库通过查看自身的加载时间而不是整个页面(如上面的performance.timing所述)得到更精确的答案,然后通过一系列10个XMLHttpRequests得到更精确的答案。另外,为了解决您的第二个问题,我的库不会忽略毫秒数(接受的答案也是如此)

图书馆名为,免费提供

以下是自述的一部分:

您可以使用
ServerDate
,就像使用
Date
函数或其一个功能一样 实例,例如:

> ServerDate()
"Mon Aug 13 2012 20:26:34 GMT-0300 (ART)"

> ServerDate.now()
1344900478753

> ServerDate.getMilliseconds()
22
还有一种新的方法可以获得ServerDate对数据的估计精度 服务器的时钟(以毫秒为单位):

您可以看到服务器时钟和浏览器时钟之间的差异,以毫秒为单位:

> ServerDate.toLocaleString() + " ± " + ServerDate.getPrecision() + " ms"
"Tue Aug 14 01:01:49 2012 ± 108 ms"
> ServerDate - new Date()
39

你能再多告诉我一点这是干什么用的吗?你永远不能信任客户机,因此无论如何你都必须在服务器端进行检查。@TheShellfishMeme,页面的逻辑就像拍卖一样。我在服务器上有PHP验证,但我想防止客户端能够提交,然后被服务器阻止-这只会导致与客户端发生争议,说他们确实及时进入了。