我正在研究主要是自包含的移动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毫秒的执行时间(包括任何“重负载”)。
我有同样的问题,没有使用Interval或WatchPosition - intead我正在使用Jquery Quicksand插件...不知道该怎么做。 – Ash
您是否让浏览器处于损坏状态或执行超时但脚本仍然运行?除非这些插件支持CSS动画,否则我不会使用Quicksand或jQuery UI等插件进行移动开发。软件动画相当耗费资源,并且很容易在移动浏览器上超时。如果你坚持使用它,我会考虑将其重写为使用CSS动画,转换和转换,而不是绝对定位和循环。在Safari中,CSS方法是硬件加速的,性能更好*。 – illvm