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").
Tengo el mismo problema y no uso Interval o WatchPosition - intead estoy usando Jquery Quicksand Plugin ... no estoy seguro de qué hacer. – Ash
¿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