Tại sao điều này xảy ra ...
Vì các trình duyệt chạy JavaScript trên thread UI chính mà họ sử dụng để cập nhật trang, cho một loạt các lý do. Vì vậy, mặc dù bạn đã hiển thị văn bản "hi", nó không được hiển thị cho đến khi mã JavaScript chạy để phản hồi cho sự kiện hoàn tất.
... và cách khắc phục điều này?
Quay lại trình duyệt sau khi thêm văn bản, trước khi thực hiện bất cứ điều gì bạn đang mô phỏng với vòng lặp đó. setTimeout
với một sự chậm trễ của 0
phù hợp cho nhiều trường hợp:
var someLargeNumber = 5000000000;
function hello() {
document.getElementById('hi').innerHTML = "hi";
setTimeout(function() {
for(var i = 0; i < someLargeNumber; i++) {}
}, 0);
}
Động cơ JavaScript làm việc cơ bản trong một vòng lặp với một hàng đợi công việc (spec gọi họ là "công việc"). Nó chọn một công việc từ hàng đợi, chạy nó để hoàn thành, và sau đó tìm kiếm công việc tiếp theo. Các trình duyệt (thường) cập nhật giao diện người dùng khi động cơ nằm giữa các công việc. Khi một sự kiện xảy ra, một công việc được xếp hàng đợi để gọi trình xử lý sự kiện. Ở trên chỉ di chuyển vòng lặp vào một công việc mới mà nó xếp hàng qua setTimeout
, do đó trình duyệt có cơ hội sau công việc sự kiện và trước khi công việc setTimeout
cập nhật giao diện người dùng.
Nguồn
2015-11-26 14:03:02
Có lẽ bạn có thể đưa ra các vòng lặp. Tại sao nó lại ở đó? Trình duyệt sẽ không (nhất thiết) lại hiển thị trang cho đến khi trình xử lý "click" được hoàn tất. – Pointy