iOS 6 Safari,setInterval 不会被解雇

Posted

技术标签:

【中文标题】iOS 6 Safari,setInterval 不会被解雇【英文标题】:iOS 6 safari, setInterval doesn't get fired 【发布时间】:2012-10-02 01:49:52 【问题描述】:

似乎如果我正在滚动windowwindow.setInterval 在滚动发生时或之后不会被附加/触发。 有其他人遇到过同样的问题吗?

我的意思是...

可能是什么原因造成的? 我可以做些什么来解决这个问题?

【问题讨论】:

也许它会在滚动时停止所有脚本以节省内存并使动画运行得更快。只是猜测。 @Derek,不,其他一切似乎都执行得很好,直到 setInterval 之前的行。 【参考方案1】:

ios 会暂停几乎所有内容以响应用户触摸,以确保其感觉响应灵敏。 setInterval 问题是已知的,似乎没有解决方法。

setInterval pauses in iphone/ipad (mobile Safari) during scrolling

编辑

在“冻结”期间,一旦用户释放屏幕,计时器就不会赶上。错过的事件不会被推迟,而是完全丢失(一个错误)。

【讨论】:

它不只是暂停它,即使在滚动之后也不会触发。暂停问题是不同的,如果在页面滚动之前附加了 setInterval,就会发生这种情况。就我而言,它是在页面滚动期间附加的。 对。在“冻结”期间,一旦用户释放屏幕,计时器将不会赶上。但是,如果 JS 引擎在此期间暂停,您的事件如何在滚动期间附加?您确定它不只是在滚动期间触发并被丢弃吗? 我也有同样的问题。如果用户滚动,我会收到触摸事件,放手然后再次触摸。但是我的 setTimeout 被丢弃了。我丑陋的 hacky 解决方案是在每次滚动事件后进行清理。 (超级丑!) 这个答案不正确。超时永远不会触发;它被默默地丢弃了。这是一个可怕的、邪恶的虫子。 @GlennMaynard 为什么我的回答不正确? OP 询问其已知行为(是)以及是否有解决方案(否,至少不是来自 Apple)。无论是 bug 还是 Apple 根本不在乎,我不知道为什么它应该投反对票。【参考方案2】:

找到了这个(可怕但惊人的)解决方法,它在 iOS 6.0 中对我有用:

https://gist.github.com/3755461

【讨论】:

【参考方案3】:

我不完全确定,但您可以使用setTimeout 代替setInterval?无论如何,使用 setInterval 通常是不好的做法。

var delay = 100;
(function callee() 
    setTimeout(callee, delay);
)();

【讨论】:

我不确定我是否同意使用setInterval通常是一种不好的做法(尽管它肯定会被过度使用,尤其是在更适合 requestAnimationFrame 的地方重绘) .但是,可以为arguments.callee 是一种不好的做法提出论据(这就是为什么它是removed from strict mode)。 setTimeout 问题仍然存在【参考方案4】:

iOS6 Safari 存在一个错误,该错误会杀死在页面滚动时创建的计时器。

kTmnh 通过在滚动完成后重新创建计时器来解决此问题

https://gist.github.com/3798925。

【讨论】:

以上是关于iOS 6 Safari,setInterval 不会被解雇的主要内容,如果未能解决你的问题,请参考以下文章

html5 音频在 ios Safari 中不起作用

如何在 iOS 上仅将 javascript 函数定位到 Safari < 6.0

全屏api HTML5和Safari(iOS 6)

带有 iOS 8(Xcode 6)的 iOS 模拟器未显示在 Safari 开发菜单中

Is Safari on iOS 6 caching $.ajax results? post Cache

清除内容可编辑的div时键盘在Safari iOS 6中停止工作