Oto, co wydarzy się w środowisku wykonawczym javascript:
document.body.style.backgroundColor
zmieni jej wartość na 'green'
.
- Uruchomiony zostanie długotrwały proces.
document.body.style.backgroundColor
zmieni wartość na 'red'
.
Nie jest określone, w jaki sposób zmiany w właściwości backgroundColor
wpłyną na wygląd strony, jeśli wątek JavaScript jest zablokowany.
Oto przykład. Jeśli klikniesz słowo hello
, widać niewielkie opóźnienie, a następnie tło zmieni kolor na czerwony:
function handleEvent(e){
document.body.style.backgroundColor = 'green';
longRunningFunction();
document.body.style.backgroundColor = 'red';
}
function longRunningFunction() {
for(var i=0; i<2000000000; ++i) { +i; }
}
document.body.addEventListener("click", handleEvent);
<div>hello</div>
To dlatego, że silnik renderowania w przeglądarce, który odświeża w odpowiedzi na zmiany w CSS Właściwości blokuje długotrwała blokująca funkcja JavaScript. Nie jest to określone zachowanie, ale rzeczywistość implementacji dla wszystkich przeglądarek. Aby uzyskać podobne pytanie, patrz How can I force the browser to redraw while my script is doing some heavy processing?.
Myślę, że dowolna przeglądarka mogłaby zdecydować się na uruchomienie oddzielnego przerysowania wątku współbieżnego z wątkiem JavaScript, ale nie wierzę, że jakiekolwiek większe przeglądarki obecnie to robią. W takim podejściu mogą występować zawiłości stanu rasowego; Nigdy nie napisałem przeglądarki, więc nie wiem.
Jeśli chcesz pokazać stan pośredni, można użyć bardzo szybki setTiemout
połączenia po ustawieniu backgroundColor
na zielony, aby usunąć funkcję stos JavaScript i pozwalają renderujący odświeżenia strony:
function handleEvent(e){
document.body.style.backgroundColor = 'green';
setTimeout(function() {
longRunningFunction();
document.body.style.backgroundColor = 'red';
}, 4);
}
Spowoduje to dodanie do kolejki longRunningFunction
i drugiej zmiany koloru, która ma potrwać 4 milisekundy w przyszłości. Podczas tych nieaktywnych 4 milisekund renderer ma szansę przerysować stronę.
Myślę, że są pewne style, które pojawią się od razu, jeśli wpłyną na układ. ogólnie rzecz biorąc, dom rzeczy dostaje się w wątku, który robi inne rzeczy. Krótki czas oczekiwania w ciągu ostatnich dwóch linii sprawiłby, że najpierw pokazałyby się zielone. – dandavis
Javascript jest pojedynczy wątek, więc twój 'longRunningFunction()' będzie blokował. Niezależnie od tego, czy przerysowanie może się zdarzyć podczas działania, na pewno nie będę na nim polegać. –