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").
Ho lo stesso problema e non utilizzo Interval o WatchPosition - sto utilizzando il plug-in Jquery Quicksand ... non sono sicuro di cosa fare. – Ash
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