Mam pewne przetwarzanie, które potrwa kilka sekund, więc chcę dodać wskaźnik wizualny, gdy jest on w toku.Synchroniczny/asynchroniczny charakter renderowania przeglądarki i wykonywania javascript
.processing
{
background-color: #ff0000;
}
<div id="mydiv">
Processing
</div>
Scenariusz:
$("#mydiv").addClass("processing");
// Do some long running processing
$("#mydiv").removeClass("processing");
ja naiwnie myślałem, że klasa będzie stosowana do div i interfejs użytkownika będzie aktualizowana. Jednak uruchamianie tego w przeglądarce (przynajmniej w Firefoksie) div nigdy nie jest podświetlone. Czy ktoś może mi wyjaśnić, dlaczego mój div nigdy nie zostanie wyróżniony? Klasa jest dodawana, przetwarzanie odbywa się, a następnie klasa jest usuwana; interfejs użytkownika nie jest aktualizowany pomiędzy, a użytkownik nigdy nie widzi czerwonego tła.
Wiem, że JS jest jednowątkowe, ale zawsze zakładałem, że renderowanie przeglądarki będzie działało synchronicznie w czasie, gdy DOM jest aktualizowany. Czy moje założenie jest nieprawidłowe?
Co ważniejsze, jaki jest zalecany sposób osiągnięcia tego efektu? Czy konieczne jest użycie funkcji setTimeout
, aby spowolnić przetwarzanie asynchroniczne i pracować z funkcją oddzwaniania? Musi istnieć lepszy sposób, ponieważ naprawdę nie potrzebuję tutaj zachowania asynchronicznego; Chcę tylko odświeżyć interfejs.
EDIT:
JSFiddle: http://jsfiddle.net/SE8wD/5/
(uwaga, może być konieczne, aby dostosować liczbę iteracji pętli, aby dać Ci rozsądny termin na własnym komputerze)
Wierzę, że takie zmiany spowodują przejście bezpośrednio do DOM, ale przeglądarka będzie czekała, aż wykonywanie JavaScriptu będzie "bezczynne" przed wykonaniem jakiegokolwiek odświeżenia. – pimvdb
"Czy niektóre długotrwałe przetwarzanie" ma jakieś asynchroniczne wywołanie? (ajax, settimeout itp.) –
Nie mogę naprawdę zobaczyć, gdzie twój kod idzie nie tak, ponieważ wydaje się dobrze z tego, co napisałeś. Może jest jakiś "! Important" w twoim zewnętrznym pliku css. Czy jesteś pewien, że klasa została dodana (czy sprawdziłeś ją za pomocą firebuga) i czy proces trwa tak długo? może zdarza się zbyt szybko –