iOS 6 Safari,setInterval 不会被解雇
Posted
技术标签:
【中文标题】iOS 6 Safari,setInterval 不会被解雇【英文标题】:iOS 6 safari, setInterval doesn't get fired 【发布时间】:2012-10-02 01:49:52 【问题描述】:似乎如果我正在滚动window
,window.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 不会被解雇的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 上仅将 javascript 函数定位到 Safari < 6.0
带有 iOS 8(Xcode 6)的 iOS 模拟器未显示在 Safari 开发菜单中