2011-10-24 33 views
5

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").

+0

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

+0

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

Trả lời

0

Bạn đang sử dụng watchPosition? hãy xem câu trả lời này nếu có: JavaScript execution exceeded timeout

Tôi đã xé tóc ra khỏi vấn đề này kể từ khi iOS 5 được phát hành - Tôi cảm thấy nỗi đau của bạn!

+0

Tôi không, nhưng đồng nghiệp của tôi đang ở trên một trang khác tại một miền khác được truy cập trước ứng dụng này. Tuy nhiên, tôi đã sử dụng setInterval mà không xóa khoảng thời gian trong trình xử lý. Tôi đã thay đổi mã để xóa các khoảng thời gian bất cứ khi nào xử lý được gọi và khởi động lại khoảng thời gian và đã không có vấn đề kể từ đó. Tôi tự hỏi liệu hai vấn đề có liên quan không. – illvm

+0

thú vị - tôi sử dụng một số setIntervals mà không có một vấn đề ... tôi nghĩ rằng nó đã được một số loại lỗi safari di động iOS5 bởi vì mọi trình duyệt khác tôi thử nghiệm không phải là ném các lỗi này. vui vì bạn đã tìm thấy một giải pháp mặc dù! –

Các vấn đề liên quan