Javascript Cordova/PhoneGap:setInterval()/setTimeout()工作不正常

Javascript Cordova/PhoneGap:setInterval()/setTimeout()工作不正常,javascript,cordova,Javascript,Cordova,我使用window.setInterval实现了一个简单的倒计时计时器。它在我的桌面浏览器中运行良好,但在我的智能手机(Fairphone 2)上作为PhoneGap/Cordova应用程序运行不正常。根据我在互联网上的检查和研究,当手机进入睡眠/待机状态时,间隔/超时会被中断。这就是它不起作用的原因 令人惊讶的是,当我的手机通过usb电缆连接到电脑时,间隔/超时没有中断。因此,可能是节能功能导致了这种不良行为 所以,我迷路了。我不知道如何实现我的简单倒计时计时器,当然,当手机睡眠(=显示器关闭

我使用window.setInterval实现了一个简单的倒计时计时器。它在我的桌面浏览器中运行良好,但在我的智能手机(Fairphone 2)上作为PhoneGap/Cordova应用程序运行不正常。根据我在互联网上的检查和研究,当手机进入睡眠/待机状态时,间隔/超时会被中断。这就是它不起作用的原因

令人惊讶的是,当我的手机通过usb电缆连接到电脑时,间隔/超时没有中断。因此,可能是节能功能导致了这种不良行为

所以,我迷路了。我不知道如何实现我的简单倒计时计时器,当然,当手机睡眠(=显示器关闭)时,它也应该工作。window.setInterval()/window.setTimeout()是否有其他选项

下面是我的简单代码(如上所述:window.setTimeout也不起作用):

。。。
var最小值=25;
$(文档).ready(函数(){
intervalID=window.setInterval(函数(){
--闵;
如果(最小值>0){
$(“#倒计时”).text(分钟);
}
}, 6000);
});
...

0m


仅在更新显示时使用间隔计时器。使用系统时间决定要显示的内容

然后,如果显示不可见时未调用间隔,则这没有问题。下次调用时(显示器再次打开时),它将根据系统时间计算正确的运行时间,并正确显示

出于这个原因(以及其他一些原因),您永远不应该假设
setInterval()
将保持完美的时间。在Javascript中,它只是意味着您希望每隔一段时间被调用一次,您可以设置一个近似时间来指定频率,但是间隔可能会被关闭很长一段时间

获取时间间隔从
Date.now()
开始的时间,然后每次触发时间间隔时,获取新的系统时间并从开始时间中减去,以查看经过了多少时间,然后计算要显示的内容

如果要在25分钟计时器上显示剩余分钟数,可以执行以下操作:

function showTimer(selector, minutes) {
  var startTime = Date.now();
  var interval;

  function showRemaining() {
    var delta = Date.now() - startTime;     // milliseconds
    var deltaMinutes = delta / (1000 * 60);
    if (deltaMinutes < minutes) {
      // display minutes remaining
      $(selector).text(Math.round(minutes - deltaMinutes));
    } else {
      $(selector).text(0);
      clearInterval(interval);
    }
  }

  interval = setInterval(showRemaining, 15 * 1000);
  showRemaining();
}

$(document).ready(function(){
  showTimer("#countdown", 25);
});
功能显示计时器(选择器,分钟){
var startTime=Date.now();
var区间;
函数showLeving(){
var delta=Date.now()-startTime;//毫秒
变量deltaMinutes=delta/(1000*60);
如果(deltaMinutes<分钟){
//显示剩余分钟数
$(选择器).text(数学圆(分钟-deltaMinutes));
}否则{
$(选择器).text(0);
间隔时间;
}
}
间隔=设置间隔(显示剩余,15*1000);
显示剩余();
}
$(文档).ready(函数(){
showTimer(“倒计时”,25);
});

工作演示:

我发现一个cordova插件,即使在显示器关闭时也会执行超时/间隔:

(关于)


的答案也很有用。

当您打开显示器时,setInterval再次开始工作?“根据我的检查和我在互联网上的研究,当手机进入睡眠/待机状态时,间隔/超时被中断。”是的
setInterval
setTimeout
仅保证最小延迟。浏览器可以将它想要的时间延迟到最小值之外,原因正是您认为的:“所以可能是节能功能导致了不良行为。”您需要知道开始时间并将当前时间与之进行比较,而不是减少计数器的数量。@juvian是的,它会重新开始工作。但这并没有帮助,因为我想在倒计时结束时发出警报声…@JamesThorpe感谢您的确认=),但问题是,我想在倒计时结束时发出警报声(无需激活显示器)@FalcoPreiseni嗯,我想如果手机处于待机状态,发出警报是没有意义的,除非它是一个应用程序而不是浏览器。不过,检查当前时间,您可以知道间隔未工作的时间,并将计时器调整到该时间,如果时间已过,当屏幕再次打开时发出警报如果用户更改日期会发生什么?哈哈’_(ツ)_/¯
function showTimer(selector, minutes) {
  var startTime = Date.now();
  var interval;

  function showRemaining() {
    var delta = Date.now() - startTime;     // milliseconds
    var deltaMinutes = delta / (1000 * 60);
    if (deltaMinutes < minutes) {
      // display minutes remaining
      $(selector).text(Math.round(minutes - deltaMinutes));
    } else {
      $(selector).text(0);
      clearInterval(interval);
    }
  }

  interval = setInterval(showRemaining, 15 * 1000);
  showRemaining();
}

$(document).ready(function(){
  showTimer("#countdown", 25);
});