2011-10-24 11 views
5

Estoy trabajando en una aplicación web móvil que es principalmente independiente y se comunica con el servidor solo cuando es necesario. Actualmente, las bibliotecas que se utilizan son:iOS 5 Safari La ejecución de JavaScript superó el tiempo de espera

  • jQuery 1.6.4
  • jQuery UI 1.8.3
  • Versión modificada/parcheado de jQTouch

Hasta el lanzamiento de iOS 5 que éramos también usa touchscroll.js pero ya no es necesario, ya que Safari ahora admite la posición: desplazamiento fijo y nativo.

Desde el lanzamiento de iOS 5, aparentemente al azar, esta excepción se eleva:

JavaScript: Error undefined JavaScript execution exceeded timeout 

Una vez que se eleva, no hay código JS que tiene una duración de más de un período muy corto de tiempo (digamos 1ms) será ejecutado por Safari. Actualizar la página, ir a una nueva página o ir a un nuevo dominio no tiene ningún efecto. Cualquier y todo el código JS, incluso algo tan simple como

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

no será ejecutado por el navegador sin excepción, habiendo resucitado. La única forma de evitar esto es forzar la muerte de Safari y reiniciarlo. Supongo que también es posible ajustar cualquier código remotamente "heavy duty" en la aplicación en window.setTimeout (..., 1) o aprovechar Web Workers para todo menos para las actualizaciones de UI, pero eso no parece una muy buena solución ya que la aplicación es bastante grande y requeriría una reescritura sustancial.

¿Alguien ha tenido este problema antes? ¿Cómo haría para depurar algo así, ya que no se trata de ningún código que parezca poner a Safari en este estado roto y que pueda suceder aparentemente al azar?

Me trataron de averiguar lo que el tiempo de espera del motor de JS está en Safari móvil de la siguiente manera:

var start, end; 
start = new Date(); 

try { 
    while(true); 
} catch (ex) { 
    alert('test'); 
} 

end = new Date(); 
console.log(Number(end) - Number(start) + 'ms'); 

Por desgracia, parece que esta excepción de tiempo de espera no es una excepción JS por lo que no puede ser capturado en un bloque try/catch; sin embargo, parece que el período máximo de tiempo de espera está en el reino de varios segundos. Ninguno de los códigos de nuestra aplicación bloquea el motor de navegador/JS durante ese tiempo (ya que proporcionaría un UX terrible) y la mayoría, si no todos, probablemente tenga un tiempo de ejecución inferior a 300 ms (incluido todo lo que sea "de servicio pesado").

+0

Tengo el mismo problema y no uso Interval o WatchPosition - intead estoy usando Jquery Quicksand Plugin ... no estoy seguro de qué hacer. – Ash

+0

¿Tiene su navegador corrupto o la ejecución simplemente expira pero todavía se ejecutan las secuencias de comandos? No utilizaría complementos como Quicksand o jQuery UI para el desarrollo móvil a menos que esos complementos sean compatibles con animaciones CSS. Las animaciones de software son bastante pesadas para los recursos y pueden fácilmente agotar el tiempo de espera en un navegador móvil. Si insistes en usarlo, consideraría reescribirlo para usar animaciones CSS, transformaciones y transiciones en lugar de posicionamiento absoluto y bucle. El enfoque de CSS es hardware acelerado en Safari y tiene * mucho * mejor rendimiento. – illvm

Respuesta

0

¿Estás usando watchPosition? vea esta respuesta en caso afirmativo: JavaScript execution exceeded timeout

He estado rasgándome el pelo por este problema desde que se lanzó iOS 5 - ¡Siento su dolor!

+0

No lo soy, pero mi compañero de trabajo estaba en otra página en otro dominio al que se accede antes de esta aplicación. Sin embargo, estaba usando setInterval sin borrar el intervalo en el controlador. Cambié el código para borrar el intervalo cada vez que se llama al controlador y reinicio el intervalo y no he tenido el problema desde entonces. Me pregunto si los dos problemas están relacionados. – illvm

+0

interesante - uso varios setIntervals sin problema ... creo que tiene que ser un tipo de error de safari móvil iOS5 porque cada otro navegador que pruebo no está lanzando estos errores. ¡me alegra que hayas encontrado una solución! –

Cuestiones relacionadas