iOS 5 Safari JavaScript 执行超时

5
我正在开发一个移动Web应用程序,主要是自包含的,并且只在必要时与服务器通信。目前使用的库如下:
  • jQuery 1.6.4
  • jQuery UI 1.8.3
  • jQTouch的修改/补丁版本
在iOS 5发布之前,我们还使用了touchscroll.js,但由于Safari现在支持position:fixed和本地滚动,因此不再需要它。
自从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引擎那么长时间(因为它会提供可怕的UX),而且大多数(如果不是全部)代码执行时间可能都在300毫秒以下(包括任何“重型”任务)。


我遇到了同样的问题,没有使用Interval或WatchPosition - 相反,我正在使用Jquery Quicksand插件...不太确定该怎么办。 - Mazatec
你的浏览器是处于损坏状态,还是只是执行超时但脚本仍在运行?我不会在移动开发中使用像Quicksand或jQuery UI这样的插件,除非这些插件支持CSS动画。软件动画需要很多资源,很容易在移动浏览器上超时。如果你坚持要使用它,我建议重新编写它,使用CSS动画、转换和过渡,而不是绝对定位和循环。在Safari中,CSS方法是硬件加速的,性能更好。 - illvm
1个回答

0

你正在使用watchPosition吗?如果是,请参考此答案:JavaScript执行超时

自从iOS 5发布以来,我一直为这个问题苦恼不已 - 我感同身受!


我没有,但我的同事在另一个域的另一个页面上,这个应用程序之前就已经访问了。然而,在处理程序中我使用了setInterval而没有清除间隔。我改变了代码,每当处理程序被调用时清除间隔并重新启动间隔,自那以后就没有出现过问题。我想知道这两个问题是否有关联。 - illvm
有趣 - 我使用多个setInterval没有问题...我认为这一定是某种iOS5移动Safari的bug,因为我测试的每个其他浏览器都没有抛出这些错误。不过很高兴你找到了解决方案! - Justin

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