Đây là những gì sẽ xảy ra trong môi trường thực thi JavaScript:
document.body.style.backgroundColor
sẽ thay đổi giá trị của nó để 'green'
.
- Quy trình chạy dài sẽ chạy.
document.body.style.backgroundColor
sẽ thay đổi giá trị thành 'red'
.
Không xác định cách thay đổi trong thuộc tính backgroundColor
sẽ ảnh hưởng đến giao diện của trang, nếu chuỗi JavaScript bị chặn.
Đây là một ví dụ. Nếu bạn nhấp vào chữ hello
, bạn sẽ thấy một chút chậm trễ, và sau đó nền sẽ chuyển sang màu đỏ:
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>
Điều này là do công cụ rendering của trình duyệt mà vẽ lại để đáp ứng với những thay đổi CSS các thuộc tính bị chặn bởi hàm JavaScript chặn dài hạn. Đây không phải là hành vi được chỉ định, mà là một thực tế triển khai cho tất cả các trình duyệt. Xem How can I force the browser to redraw while my script is doing some heavy processing? cho một câu hỏi tương tự.
Tôi nghĩ rằng bất kỳ trình duyệt cụ thể nào đều có thể chọn chạy một chuỗi rút lại riêng lẻ đồng thời với chuỗi JavaScript, nhưng tôi không tin bất kỳ trình duyệt chính nào hiện đang làm như vậy. Có thể có sự phức tạp trong điều kiện chủng tộc vốn có trong cách tiếp cận như vậy; Tôi chưa bao giờ viết một trình duyệt nên tôi không biết.
Nếu bạn muốn để hiển thị trạng thái trung gian, bạn có thể sử dụng một setTiemout
gọi rất nhanh chóng sau khi cài đặt backgroundColor
sang xanh lá cây, để xóa các hàm JavaScript chồng và cho phép các renderer để vẽ lại trang:
function handleEvent(e){
document.body.style.backgroundColor = 'green';
setTimeout(function() {
longRunningFunction();
document.body.style.backgroundColor = 'red';
}, 4);
}
Hàng đợi này sẽ xếp hàng longRunningFunction
và thay đổi màu thứ hai để chạy trong 4 mili giây trong tương lai. Trong thời gian nhàn rỗi đó 4 mili giây, trình kết xuất có cơ hội vẽ lại trang.
tôi nghĩ rằng có một số kiểu sẽ hiển thị ngay lập tức, nếu chúng ảnh hưởng đến bố cục. nói chung, công cụ dom được đằng sau trong một chủ đề mà không stuff.a ngắn thời gian chờ xung quanh hai dòng cuối cùng sẽ đảm bảo màu xanh lá cây cho thấy đầu tiên. – dandavis
Javascript là đơn luồng nên 'longRunningFunction()' của bạn sẽ chặn. Có hay không một vẽ lại có thể xảy ra trong khi bạn đang chạy, tôi chắc chắn sẽ không dựa vào nó. –