iOS 5 Safari JavaScript执行超时超时

时间:2011-10-24 14:12:49

标签: javascript safari mobile-safari ios5 timeoutexception

我正在开发一个主要是自包含的移动网络应用,仅在必要时与服务器通信。目前,使用的库是:

  • jQuery 1.6.4
  • jQuery UI 1.8.3
  • jQTouch的修改/修补版本

直到iOS 5发布之前,我们还使用了touchscroll.js,但不再需要它,因为Safari现在支持位置:固定和原生滚动。

自iOS 5发布以来,似乎随机出现了这个异常:

JavaScript: Error undefined JavaScript execution exceeded timeout

一旦它被引发,Safari将不会执行超过非常短时间(例如1ms)的JS代码。刷新页面,转到新页面或转到新域名无效。任何和所有JS代码,甚至像

那样简单
for(var i = 0; i < 30; i++) ;
如果没有引发异常,浏览器将不会执行

。解决这个问题的唯一方法是强行杀死Safari并重启它。我想也可以在window.setTimeout(...,1)中将任何远程“重型”代码包装在应用程序中,或者利用Web Workers获取除UI更新之外的所有内容,但这看起来不是很好很好的解决方案,因为应用程序相当大,需要大量重写。

以前有人遇到过这个问题吗?你将如何调试这样的事情,因为似乎没有任何一段代码似乎将Safari置于这种破碎的状态,它似乎随机发生?

我试图通过执行以下操作来弄清楚移动Safari中JS引擎的超时:

var start, end;
start = new Date();

try {
   while(true);
} catch (ex) {
  alert('test');
}

end = new Date();
console.log(Number(end) - Number(start) + 'ms');

不幸的是,这个超时异常似乎不是JS异常所以它不能被try / catch块捕获;但是,最大超时时间似乎在几秒的范围内。我们的应用程序中的代码都没有长时间锁定浏览器/ JS引擎(因为它会提供可怕的用户体验),并且大多数(如果不是全部)它可能有300毫秒的执行时间(包括任何“重负荷”)。 / p>

1 个答案:

答案 0 :(得分:0)

您使用的是watchPosition吗?如果是这样,请参阅此答案:JavaScript execution exceeded timeout

自从iOS 5发布以来,我一直在讨论这个问题 - 我感到很痛苦!