5

我正在开发一个移动网络应用程序,该应用程序主要是独立的,仅在必要时才与服务器通信。目前,正在使用的库是:

  • 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 毫秒的执行时间(包括任何“繁重的任务”)。

4

1 回答 1

0

你在使用 watchPosition 吗?如果是这样,请参阅此答案:JavaScript 执行超出超时

自从 iOS 5 发布以来,我一直在为这个问题烦恼——我感受到了你的痛苦!

于 2011-10-25T17:09:42.750 回答