2013-01-16 14 views
5

Diciamo ho questa funzione javascript:animazioni CSS stallo durante l'esecuzione di javascript funzione

function pauseComp(ms) { 
    var date = new Date(); 
    var curDate = null; 
    do { curDate = new Date(); } 
    while(curDate-date < ms); 
    } 

e un'animazione CSS3 (per esempio, <i class="icon-spinner icon-spin"></i> dal nuovo font-awesome 3). Quando eseguo la funzione javascript sopra, interrompe lo spinner mentre la funzione è in esecuzione. Vedere di cosa sto parlando here. Fondamentalmente, javascript interrompe le animazioni CSS, e mi chiedo perché, o se qualcun altro ha notato questo/trovato una soluzione alternativa. Ho provato a metterlo in un setTimeout (fn, 0), dove fn è il processo lungo, ma poi ho capito perché anche questo non funzionerà (js non è multithread). Qualcuno ha visto accadere questo?

Aggiornamento: È interessante notare che questo non è tanto un problema in Safari, anche se l'interazione con l'interfaccia del browser è ancora interessata.

+0

È necessario suddividere il "codice di esecuzione prolungata" in blocchi per consentire a tutto il resto di continuare. –

+0

Giusto, anche se sono consapevole che ciò lo risolverebbe, non è una soluzione praticabile per le funzioni che sto cercando di applicare a questo. Le funzioni non sono divisibili in blocchi più piccoli. Sto davvero controllando se qualcuno ha una soluzione per il problema esatto sopra, che, allo stesso modo, non può essere scomposto. –

risposta

5

Una pagina del browser è a thread singolo. L'aggiornamento dell'interfaccia utente avviene sullo stesso thread del programma javascript. Il che significa anche che qualsiasi animazione non disegnerà nuovi frame mentre il codice Javascript è in esecuzione. In genere, questo non è un grosso problema perché la maggior parte del codice JS viene eseguita molto rapidamente, più velocemente di un singolo frame di animazione.

Quindi il consiglio migliore è semplicemente questo: non farlo. Non bloccare il motore JS per così tanto tempo. Scopri un modo più pulito per farlo.


Tuttavia, se è necessario, c'è un modo. È possibile ottenere un thread aggiuntivo tramite HTML5's Web Workers API. Questo non è supportato nei browser più vecchi, ma ti permetterà di eseguire un po 'di codice di succhiamento della CPU a lunga distanza dalla pagina web principale e nella sua stessa thread, e poi di postare alcuni risultati alla tua pagina una volta terminato.

+0

Sì, ho visto lavoratori del web. Sai se i web worker hanno accesso al DOM? Perché il mio processo di lunga durata è che tutti gli aggiornamenti DOM si verificano in jQuery, ed è ciò che è lento. –

+0

@ChristianBankester Web Workers non può accedere al DOM. Dovrai usare 'setTimeout'. – bfavaretto

+0

Ah, ho provato a utilizzare setTimeout, che non ha funzionato. Vedi questo jsfiddle aggiornato: http://jsfiddle.net/JU4St/2/ –

Problemi correlati