Tôi đang làm việc trên ứng dụng web dành cho thiết bị di động chủ yếu là tự chứa và được liên lạc với máy chủ chỉ khi cần thiết. Hiện nay, các thư viện được sử dụng là:Chạy thử iOS 5 Safari JavaScript vượt quá thời gian chờ
- jQuery 1.6.4
- jQuery UI 1.8.3
- Modified phiên bản/vá của jQTouch
Cho đến khi phát hành iOS 5 chúng tôi đã cũng sử dụng touchscroll.js nhưng nó không còn cần thiết vì Safari hiện hỗ trợ vị trí: cố định và cuộn gốc.
Kể từ khi phát hành iOS 5, dường như một cách ngẫu nhiên, ngoại lệ này được nâng lên:
JavaScript: Error undefined JavaScript execution exceeded timeout
Sau khi nó được nâng lên, không có mã JS chạy trong hơn một thời gian rất thời gian ngắn (nói 1ms) sẽ được thực thi bởi Safari. Làm mới trang, chuyển đến một trang mới hoặc chuyển đến một miền mới sẽ không có hiệu lực. Bất kỳ và tất cả mã JS, thậm chí một cái gì đó đơn giản như
for(var i = 0; i < 30; i++) ;
sẽ không được thực thi bởi trình duyệt mà không có ngoại lệ. Cách duy nhất xung quanh điều này là để buộc giết Safari và khởi động lại nó. Tôi cho rằng nó cũng có thể bao bọc bất kỳ mã "nhiệm vụ nặng" từ xa nào trong ứng dụng trong window.setTimeout (..., 1) hoặc tận dụng lợi thế của Web Worker cho mọi thứ nhưng cập nhật giao diện người dùng nhưng điều đó dường như không giải pháp tốt như ứng dụng là khá lớn và nó sẽ yêu cầu viết lại đáng kể.
Có ai gặp phải sự cố này trước đây không? Làm thế nào bạn sẽ đi về gỡ lỗi một cái gì đó như thế này vì nó không phải là bất kỳ đoạn mã duy nhất mà dường như đặt Safari vào trạng thái này bị hỏng và nó có thể xảy ra dường như ngẫu nhiên?
Tôi cố gắng để tìm ra những gì thời gian chờ của động cơ JS là trong điện thoại di động Safari bằng cách làm như sau:
var start, end;
start = new Date();
try {
while(true);
} catch (ex) {
alert('test');
}
end = new Date();
console.log(Number(end) - Number(start) + 'ms');
Đáng tiếc là có vẻ như ngoại lệ timeout đây không phải là một ngoại lệ JS vì vậy nó không thể được đánh bắt trong một khối try/catch; tuy nhiên, nó xuất hiện khoảng thời gian chờ tối đa là trong phạm vi vài giây. Không có mã nào trong ứng dụng của chúng tôi khóa động cơ trình duyệt/JS trong thời gian dài (vì nó sẽ cung cấp UX khủng khiếp) và hầu hết nếu không phải tất cả đều có thời gian thực thi 300ms phụ (bao gồm mọi thứ "nặng").
Tôi đang gặp vấn đề tương tự và không sử dụng Khoảng thời gian hoặc Xem trước - intead Tôi đang sử dụng Plugin Jquery Quicksand ... không hoàn toàn chắc chắn phải làm gì. – Ash
Bạn có nhận được trình duyệt của mình ở trạng thái bị hỏng hoặc thực hiện thao tác chỉ trong thời gian chờ nhưng các tập lệnh vẫn chạy? Tôi sẽ không sử dụng các plugin như Quicksand hoặc jQuery UI để phát triển di động trừ khi các plugin đó hỗ trợ hoạt ảnh CSS. Các hình ảnh động phần mềm là khá nặng tài nguyên và có thể dễ dàng thời gian ra trên một trình duyệt di động. Nếu bạn nhấn mạnh vào việc sử dụng nó tôi sẽ xem xét viết lại nó để sử dụng hình ảnh động CSS, biến đổi, và quá trình chuyển đổi thay vì vị trí tuyệt đối và looping. Cách tiếp cận CSS là phần cứng được tăng tốc trong Safari và có * nhiều * hiệu suất tốt hơn. – illvm