iOS 6的js事件function不调用,如果有setTimeout在其中

我注意到这个奇怪的行为与最新的iOS(iOS 6)。 如果为任何具有setTimeout的触摸事件调用函数,那么setTimeout内的部分永远不会被触发。

只有当有“系统animation”,如滚动和放大/缩小,才会发生这种情况。

例如:

http://jsfiddle.net/p4SdL/2/

(我用jquery只是为了testing,但同样的情况发生在纯js上)

在任何iOS 6设备上使用Safari浏览器打开该页面,然后放大或缩小。 警报永远不会被调用。

如果在任何iOS 5设备上testing,这将工作得很好! 在这些animation中,似乎setTimeout或setInterval被操作系统重置。 这是预期的行为还是错误?

谢谢

注意 :它看起来像UIWebView不支持requestAnimationFrames。 感谢Guillaume Gendre指出!

我们遇到了一个类似的问题,我们正在开发一个Web应用程序。

对我们来说,触动是造成问题的原因。 我们实施了一个解决方法(在这里find: https : //gist.github.com/3755461 )似乎工作得很好,直到另一个问题迫使我们放弃它。 (我尝试将解决方法添加到你的小提琴中,并且能够让计时器触发一两次,但是它需要一个奇怪的手势+滚动事件,几乎不可能持续重现。)

无论如何,iOS 6开发者的新function之一是requestAnimationFrames。 我的解决方法基本上是定时器的包装,允许开发人员传递布尔值,这将调用本机函数或解决方法函数。

例如:

setTimeout(function(){alert("HI")}, 1000); // using native setTimeout(function(){alert("HI")}, 1000, true); // using workaround 

以下是使用该解决方法的其他方法:

 setInterval(function(){console.log("Interval")}, 1000, true); var timer = setTimeout(function(){ /* ... */ }, 60000, true); clearTimeout(timer); var interval = setInterval(someFunc, 10000, true); if(someCondition) clearInterval(interval); 

这里有两个解决办法的例子。 尝试在黑色方块上捏/缩放:

http://jsfiddle.net/xKh5m/embedded/result (使用本机setTimeout函数) http://jsfiddle.net/ujxE3/embedded/result

我们已经在生产环境中使用了这个解决scheme了几个月,并没有遇到任何重大问题。

以下是解决方法的一个公共要点: https : //gist.github.com/4180482

以下是有关requestAnimationFrames的更多信息:

MDN文档

保罗爱尔兰请求animation帧

祝你好运!