我正在开发一个移动Web应用程序,主要是自包含的,并且只在必要时与服务器通信。目前使用的库如下:
自从iOS 5发布以来,似乎随机出现了这个异常:
一旦触发此事件,Safari浏览器将不会执行超过非常短的时间(比如1ms)的任何JS代码。刷新页面、跳转到新页面或者新域名都没有任何效果。即使是最简单的JS代码也不能被执行。
- jQuery 1.6.4
- jQuery UI 1.8.3
- jQTouch的修改/补丁版本
自从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毫秒以下(包括任何“重型”任务)。