iOS 5 在选项卡未被激活时暂停 JavaScript。

4
我有一个特定于iOS 5的问题,而相同的代码在iOS 4.X和其他桌面浏览器中运行正常。
我正在使用JavaScript每隔几秒钟执行一些操作,现在的问题是当我在iPad Safari中切换到另一个选项卡时,此脚本停止工作。
当我切换回此选项卡时,它又开始正常工作了。
您可以在此页面上重现此问题, http://www.w3schools.com/js/tryit.asp?filename=tryjs_timing_infinite 请访问此链接,点击开始计数,然后转到其他浏览器选项卡。几秒钟后返回此选项卡,您会发现计数器在选项卡不活动时没有增加。
我认为这是苹果为了提高性能而做出的调整。是否有人可以提供解决方案,使其正常工作?我完全陷入了这个问题中。

我梦想着让我的桌面Web浏览器做到这一点。 :-) - Nicolas Barbulesco
实际上在Chrome浏览器中它运行良好。 - banny
4个回答

6
如果你有一个计数器,不要每秒递增1,而是存储“开始时间”,然后计算自那个开始时间以来的计数。你仍然需要每秒执行一次,但它可以从暂停期间恢复。
<div id="counter"></div>
<script>
var startTime = new Date();

var updateCounter = function () {
    var displayArea = document.getElementById("counter");
    var currentTime = new Date.now();
    var differenceInSeconds = Math.round((currentTime - startTime) / 1000);
    displayArea.innerHTML = differenceInSeconds ;
}

window.setInterval(updateCounter, 1000);
</script>

在JS Fiddle上查看工作示例

更新

我刚在运行IOS5的iPad2上进行了测试,它确实会暂停非活动选项卡中JavaScript的执行。你无法防止这种行为,只能与之一起工作。

在JS Fiddle上查看测试页面


2
好的,那不是我的问题,我想知道为什么我的JavaScript在iPad(iOS 5)上的选项卡未激活时会暂停。 - Anil Shahu
4
你所猜测的原因是正确的,JavaScript因为性能问题而暂停。据我所知,没有办法使JavaScript在后台运行,除非有这种方法,否则唯一的解决办法就是编写代码以便能够从暂停中恢复,就像Sohnee所说的那样。 - Adrian Schmidt
谢谢您在回答中放置代码,但那不是我需要的。计数器链接只是为了解释脚本暂停的问题。有人能回答我的实际问题吗?即如何使JavaScript在浏览器选项卡不活动时工作。 - Anil Shahu
2
@AnilShahu 我之前的回答中已经包含了答案,即你无法改变浏览器的行为,必须在其限制范围内工作。 - Fenton
为什么Math.round()调用有第二个参数?而currentTime为什么只是一个日期,而不是Date().getTime()? - Alkanshel
Math.round - 这是一个打字错误。已经修正。new Date() 的性能优于 Date().getTime(),但我已经改成了更快的 Date.now()。所有三个函数返回相同的值。 - Fenton

1

对于iOS 5来说,这并不是什么新鲜事。移动版Safari一直会暂停非活动标签页的JavaScript执行。我知道这一点是因为我在一两年前的一个网页中进行了地理位置坐标记录的测试。


我认为它在我的上一代iPad上使用iOS 4可以运行,但是,无论如何,有人能回答我的实际问题吗?即如何使JavaScript在选项卡未激活时工作,或者根本不可能? - Anil Shahu
2
就像大家所说的那样,你做不到。这是不可能的,因为移动版Safari不是这样工作的。 - Geuis

0

0

我在iPad上遇到了一个问题,当打开新标签页时,我无法捕获“focus”事件。经过寻找正确的事件,我发现可以使用“pageshow”。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接