我正在开发一个移动网络应用程序,该应用程序主要是独立的,仅在必要时才与服务器通信。目前,正在使用的库是:
- 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 将不会执行运行时间超过很短时间(比如 1 毫秒)的 JS 代码。刷新页面、转到新页面或转到新域均无效。任何和所有的 JS 代码,甚至像这样简单的代码
for(var i = 0; i < 30; i++) ;
除非引发异常,否则浏览器不会执行。解决这个问题的唯一方法是强制杀死 Safari 并重新启动它。我想也可以在 window.setTimeout(..., 1) 中将应用程序中的任何远程“重型”代码包装起来,或者利用 Web Worker 进行除 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 毫秒的执行时间(包括任何“繁重的任务”)。