【问题标题】:How to have server side countdown timer in javascript?如何在javascript中设置服务器端倒数计时器?
【发布时间】:2019-09-24 07:46:00
【问题描述】:

我目前正在 web 视图上构建此计时器,其中计时器将使用 javascript 自动更新,并且计时器将每秒递减。

当前的问题是,当用户让手机进入睡眠状态时,计时器不会相应更新,倒计时会有点过,所以我想通过服务器端更新计时器而不是依赖函数如果用户让手机进入睡眠状态,它就会中断。这是我拥有的当前代码

<h2 id="timer"> 
   1:00
<h2>

<script>
   var countdown = new Date("<?php echo $row['end_timer'] ?>").getTime();
   var now = new Date("<?php echo date('Y-m-d H:i:s') ?>")

     var x = setInterval(function() {

         // Increase the distance by 1
         now.setSeconds(now.getSeconds() +                                           

         var distance = countdown - (now.getTime());

         var seconds = Math.floor((distance % (1000 * 60)) / 1000);

          document.getElementById("timer").innerHTML = (seconds < 10 ? '0' : '') + seconds;

          if (distance < 0) {
             clearInterval(x);
             document.getElementById("timer").innerHTML = "00";
             location.reload();
           }
     }, 1000);
</script>

【问题讨论】:

  • 你可以这样做,但你不应该使用 PHP。 PHP 设计为在短时间内(毫秒)运行一次。让 PHP 运行几分钟是可能的,但它有很多问题。 Node.js 会更适合这种任务。或者,您可以重写您的 JS 代码,以便在手机进入睡眠状态时它仍然可以工作
  • 手机唤醒后使用单个 ajax 调用与服务器重新同步?
  • 如何与 ajax 调用重新同步?

标签: javascript php time timer


【解决方案1】:

我可以想出三种方法来与服务器同步倒计时。

  1. 每秒或手机唤醒时发送AJAX request
  2. 使用Server Sent Events
  3. 使用WebSockets

但是有一个更简单的方法。你可以重写你的JS。 您将 1 秒添加到您的 now 变量。但这不起作用,因为如果手机处于睡眠状态,setInterval 不会在指定的时间间隔(在您的情况下为 1000 毫秒)调用其回调。所以你在now 上加了一秒,尽管已经过了一秒多。

var countdown = new Date(Date.now()+30*1000) // Countdown will end in 30 sec from now
var cdElem = document.getElementById("coutdown");

function displayCountdown() {
  //Time until the end of the countdown in ms
  var deltaTime = countdown.getTime() - Date.now();
  if(deltaTime < 0) {
    clearInterval(intervalId)
    deltaTime = 0;
  }
  cdElem.innerText = Math.round(deltaTime/1000);
}

var intervalId = setInterval(displayCountdown, 1000);
displayCountdown()
&lt;h1 id="coutdown"&gt;&lt;/h1&gt;

【讨论】:

  • 感谢您的回答!我现在的问题是如何将其设置为某个时区。由于服务器端是 UTC,我需要将 javascript 更改为 UTC 时间吗?
  • 如果您构造这样的日期,您可以指定时区偏移量:new Date('August 19, 1975 23:15:30 GMT-02:00'); 或者您可以使用方法.getTimezoneOffset() 并做一些数学运算
  • 如果有轻微的偏移,你将如何将 javascript 时间与服务器时间同步?
  • 您可以使用 PHP 中的 round(microtime(true) * 1000) 和 JS 中的 Date.now() 来获取自 1970 年 1 月 1 日以来的毫秒数。使用这两个值的差异来调整倒计时。
猜你喜欢
  • 2012-05-10
  • 2012-02-13
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 2011-10-09
相关资源
最近更新 更多