2011-10-24 12 views
5

Sto lavorando a un'app Web mobile che è principalmente autonoma e comunicata con il server solo quando necessario. Attualmente, le librerie in uso sono:iOS 5 Safari L'esecuzione di JavaScript ha superato il timeout

  • jQuery 1.6.4
  • jQuery UI 1.8.3
  • Modified versione/patch di jQTouch

Fino al rilascio di iOS 5 siamo stati utilizza anche touchscroll.js ma non è più necessario dal momento che Safari ora supporta la posizione: lo scorrimento fisso e nativo.

Dopo il rilascio di iOS 5, apparentemente a caso, questa viene sollevata un'eccezione:

JavaScript: Error undefined JavaScript execution exceeded timeout 

Una volta sollevato, nessun codice JS che corre per più di un breve periodo molto di tempo (diciamo 1 ms) sarà eseguito da Safari. L'aggiornamento della pagina, l'apertura di una nuova pagina o l'accesso a un nuovo dominio non hanno alcun effetto. C'è ne e tutto il codice JS, anche qualcosa di semplice come

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

non verrà eseguita dal browser, senza l'eccezione viene sollevata. L'unico modo per aggirare questo è forzare l'uccisione di Safari e riavviarlo. Suppongo che sia anche possibile avvolgere qualsiasi codice "heavy duty" remoto nell'applicazione in un window.setTimeout (..., 1) o sfruttare il Web Worker per tutto tranne gli aggiornamenti dell'interfaccia utente, ma questo non sembra molto buona soluzione in quanto l'applicazione è abbastanza grande e richiederebbe una riscrittura sostanziale.

Qualcuno ha riscontrato questo problema prima? Come faresti a eseguire il debug di qualcosa di simile in quanto non è un singolo pezzo di codice che sembra mettere Safari in questo stato rotto e può accadere apparentemente a caso?

ho cercato di capire che cosa il timeout del motore JS è in Safari mobile effettuando le seguenti operazioni:

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

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

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

Purtroppo sembra questa eccezione timeout non è un'eccezione JS in modo che non possa essere preso in un blocco try/catch; tuttavia, sembra che il periodo massimo di timeout sia nel regno di alcuni secondi. Nessuno del codice nella nostra app blocca il motore browser/JS per così tanto tempo (in quanto fornirebbe una terribile UX) e la maggior parte, se non tutti, probabilmente ha un tempo di esecuzione inferiore a 300 ms (incluso tutto ciò che è "pesante").

+0

Ho lo stesso problema e non utilizzo Interval o WatchPosition - sto utilizzando il plug-in Jquery Quicksand ... non sono sicuro di cosa fare. – Ash

+0

Stai ottenendo il tuo browser in uno stato corrotto o l'esecuzione è appena scaduta, ma gli script vengono ancora eseguiti? Non userei plugin come Quicksand o jQuery UI per lo sviluppo mobile a meno che questi plugin non supportino le animazioni CSS. Le animazioni del software sono piuttosto pesanti e potrebbero facilmente scadere su un browser mobile. Se si insiste a utilizzarlo, prenderei in considerazione la possibilità di riscriverlo utilizzando animazioni, trasformazioni e transizioni CSS anziché il posizionamento e il loop assoluti. L'approccio CSS è accelerato dall'hardware in Safari e presenta prestazioni * molto * migliori. – illvm

risposta

0

Stai usando watchPosition? vedi questa risposta se così: JavaScript execution exceeded timeout

Mi sono strappato i capelli per questo problema da quando è stato rilasciato iOS 5 - sento il tuo dolore!

+0

Non lo sono, ma il mio collega era su un'altra pagina in un altro dominio a cui si accede prima di questa applicazione. Stavo, comunque, usando setInterval senza cancellare l'intervallo nel gestore. Ho cambiato il codice per cancellare l'intervallo ogni volta che viene chiamato il gestore e riavviare l'intervallo e non ho avuto il problema da allora. Mi chiedo se i due problemi siano collegati. – illvm

+0

interessante - uso parecchie setIntervals senza un problema ... penso che debba essere una specie di bug di iOS5 mobile safari perché ogni altro browser che collaudo non sta lanciando questi errori. felice che tu abbia trovato una soluzione! –