2011-10-24 5 views
5

주로 필요한 경우에만 서버와 독립적으로 통신하는 모바일 웹 앱을 만들고 있습니다. 현재 사용되는 라이브러리는 다음과 같습니다iOS 5 Safari JavaScript 실행 시간이 초과되었습니다.

  • jQuery를 우리가 있었던에서 iOS 5의 출시까지 jQTouch

의 1.6.4

  • jQuery를 UI 1.8.3
  • 수정/패치 버전 또한 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)에서 응용 프로그램에 원격으로 "강력 함"코드를 래핑하거나 UI 업데이트를 제외한 모든 작업에 대해 웹 작업자를 활용할 수 있다고 생각하지만 이는별로 좋아 보이지 않습니다. 응용 프로그램으로 좋은 해결책은 상당히 크고 상당한 재 작성이 필요합니다.

    전에이 문제가 발생 했습니까? 사파리를 깨뜨린 상태에 빠뜨리는 것처럼 보이는 코드 하나가 아니기 때문에 어떻게 이런 디버깅을 할 수 있습니까?

    은 내가 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 엔진을 잠그지 않고 (끔찍한 UX를 제공 할 것이므로) 대부분의 브라우저가 아마 300 밀리 초의 실행 시간을 가지고있다.

  • +0

    Interval 또는 WatchPosition을 사용하지 않고 같은 문제가 발생합니다. Jquery Quicksand Plugin을 사용하고 있습니다. 무엇을해야할지 잘 모르겠습니다. – Ash

    +0

    브라우저가 손상된 상태가되었거나 실행이 시간 초과되었지만 스크립트가 계속 실행됩니까? 그 플러그인이 CSS 애니메이션을 지원하지 않는다면 Quicksand 나 jQuery UI 같은 플러그인을 모바일 개발에 사용하지 않을 것입니다. 소프트웨어 애니메이션은 꽤 무겁고 모바일 브라우저에서 쉽게 시간 초과 될 수 있습니다. 당신이 그것을 사용하기를 주장한다면 나는 CSS 애니메이션, 변환, 그리고 절대 위치 지정 및 반복 대신에 전환을 사용하여 다시 작성하는 것을 고려할 것이다. CSS 방식은 Safari에서 하드웨어 가속을 사용하며 성능이 훨씬 우수합니다. – illvm

    답변

    0

    watchPosition을 사용하고 있습니까? 다음 경우에 해당 답변을 참조하십시오. JavaScript execution exceeded timeout

    iOS 5가 출시 된 이래로이 문제에 대한 내 머리를 찢어 버렸습니다.

    +0

    나는 아닙니다, 그러나 나의 동료는이 신청 이전에 접근되는 다른 영역에있는 다른 페이지에있었습니다. 그러나 setInterval을 사용하여 처리기의 간격을 지우지 않았습니다. 처리기가 호출 될 때마다 간격을 지우고 간격을 다시 시작한 후 문제가 발생하지 않도록 코드를 변경했습니다. 두 가지 이슈가 관련되어 있는지 궁금합니다. – illvm

    +0

    흥미 롭습니다 - 문제없이 여러 setIntervals를 사용합니다 ... 다른 모든 브라우저에서 테스트 할 때 이러한 오류가 발생하지 않기 때문에 일종의 iOS5 모바일 사파리 버그 여야합니다. 다행히 해결책을 찾았습니다! –

    관련 문제