Cordova/PhoneGap: setInterval() / setTimeout() 无法正常工作
Cordova/PhoneGap: setInterval() / setTimeout() not working correctly
我用window.setInterval实现了一个简单的倒数计时器。它在我的桌面浏览器中完美运行,但在我的智能手机(Fairphone 2)上无法正常工作,因为它是PhoneGap/Cordova应用程序。根据我的检查和我在互联网上的研究,当手机进入睡眠/待机状态时,间隔/超时会中断。这就是为什么它不起作用的原因。
令人惊讶的是,当我的手机通过USB电缆连接到计算机时,间隔/超时不会中断。因此,可能是导致不良行为的节能功能。
所以,我迷路了。我不知道如何实现我的简单倒数计时器,这当然应该在手机睡眠时工作(=显示屏关闭)。有没有 window.setInterval()/window.setTimeout() 的替代方案?
这是我的简单代码(如前所述:window.setTimeout 也不起作用):
...
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/libs/jquery.js"></script>
<script>
var min = 25;
$(document).ready(function(){
intervalID = window.setInterval(function () {
--min;
if (min > 0) {
$("#countdown").text(min);
}
}, 6000);
});
</script>
...
<p id="countdown">0m</p>
仅将间隔计时器用于更新显示。 使用系统时间来决定要显示的内容。
然后,如果在显示不可见时未调用您的间隔,则没有问题。 下次调用它时(当显示器再次打开时),它将从系统时间计算正确的经过时间,并且它将正确显示。
出于这个原因(以及其他几个原因),你永远不应该假设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);
});
工作演示:https://jsfiddle.net/jfriend00/807z860p/
我找到了一个 cordova 插件,即使显示屏关闭,它也会执行超时/间隔:
Cordova-plugin-timers (on github)
jfriend00的回答也很有帮助。
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 正在尝试使用if和else添加类,但无法正常工作
- Jquery FadeIn FadeOut 只工作一次
- Foreach无法在Typescript中工作
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- JS可以在Chrome中工作,但不能在Firefox中工作
- ajaxToolkit PopupControlExtender不工作.过时的
- HTML标记在脚本标记中工作
- javascript扫雷器floodfill算法不能正常工作