2011-10-24 212 views
5

我正在研究主要是自包含的移动Web应用程序,并且仅在必要时与服务器通信。目前,正在使用的库是:iOS 5 Safari JavaScript超时执行超时

  • 的jQuery 1.6.4
  • jQuery UI的1.8.3
  • 修改/补丁jQTouch

的版本直到iOS 5中的我们释放也使用touchscroll.js,但它不再需要,因为Safari现在支持位置:固定和本地滚动。

由于iOS 5的发布,看似随意,这引发异常:

JavaScript: Error undefined JavaScript execution exceeded timeout 

一旦提出,对于时间超过非常短时间运行(比如没有JS代码1ms)将由Safari执行。刷新页面,转到新页面或转到新域名不起作用。任何和所有的JS代码,甚至一些如

for(var i = 0; i < 30; i++) ; 

简单不会被浏览器,而不引发异常执行。解决这个问题的唯一方法是强制杀死Safari并重新启动它。我想也可以在window.setTimeout(...,1)中将任何远程“重载”代码包装到应用程序中,或者利用Web Workers来处理除UI更新之外的所有内容,但这看起来并不像因为应用程序相当大,并且需要大量重写。

有没有人遇到过这个问题?你会如何去调试这样的事情,因为它不是任何似乎把Safari置入这种破碎状态的单一代码,它可能会随机发生?

我试图找出JS引擎的超时在移动Safari浏览器通过执行以下操作:

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

+0

我有同样的问题,没有使用Interval或WatchPosition - intead我正在使用Jquery Quicksand插件...不知道该怎么做。 – Ash

+0

您是否让浏览器处于损坏状态或执行超时但脚本仍然运行?除非这些插件支持CSS动画,否则我不会使用Quicksand或jQuery UI等插件进行移动开发。软件动画相当耗费资源,并且很容易在移动浏览器上超时。如果你坚持使用它,我会考虑将其重写为使用CSS动画,转换和转换,而不是绝对定位和循环。在Safari中,CSS方法是硬件加速的,性能更好*。 – illvm

回答

0

你在使用watchPosition吗?看到这个答案,如果是这样的话:JavaScript execution exceeded timeout

自从iOS 5发布以来,我一直在抓住这个问题 - 我感到你的痛苦!

+0

我不是,但是我的同事在另一个在此应用程序之前访问的域中的另一个页面上。但是,我在不清除处理程序中的间隔的情况下使用了setInterval。每当处理程序被调用时,我都改变了代码以清除间隔,并重新开始间隔并且自那之后就没有问题了。我想知道这两个问题是否有关系。 – illvm

+0

有趣的 - 我使用几个setIntervals没有问题...我认为它必须是某种iOS5移动Safari浏览器的bug,因为我测试的每个其他浏览器不会抛出这些错误。很高兴你找到了解决方案! –