Tôi có một số quá trình xử lý sẽ mất vài giây để tôi muốn thêm chỉ báo trực quan trong khi đang xử lý.Bản chất đồng bộ/không đồng bộ của hiển thị trình duyệt và thực thi javascript
.processing
{
background-color: #ff0000;
}
<div id="mydiv">
Processing
</div>
Script:
$("#mydiv").addClass("processing");
// Do some long running processing
$("#mydiv").removeClass("processing");
Tôi ngây thơ nghĩ rằng lớp sẽ được áp dụng cho các div và giao diện người dùng sẽ được cập nhật. Tuy nhiên, chạy điều này trong trình duyệt (trong Firefox ít nhất) div không bao giờ được đánh dấu. Ai đó có thể giải thích cho tôi lý do tại sao div của tôi không bao giờ được đánh dấu? Lớp được thêm vào, quá trình xử lý diễn ra và sau đó lớp được loại bỏ; giao diện người dùng không được cập nhật ở giữa và người dùng không bao giờ nhìn thấy nền màu đỏ.
Tôi biết JS là đơn luồng nhưng tôi luôn cho rằng hiển thị trình duyệt sẽ chạy đồng bộ và khi DOM được cập nhật. Giả định của tôi có đúng không?
Và quan trọng hơn, cách được khuyến nghị để đạt được hiệu ứng này là gì? Tôi có phải dẫn đến việc sử dụng setTimeout
để xử lý chậm không đồng bộ và làm việc với một cuộc gọi lại không? Phải có một cách tốt hơn vì tôi thực sự không cần bất kỳ hành vi không đồng bộ nào ở đây; Tôi chỉ muốn giao diện người dùng làm mới.
EDIT:
JSFiddle: http://jsfiddle.net/SE8wD/5/
(Lưu ý, bạn có thể cần phải tinh chỉnh số lần lặp lại vòng lặp để cung cấp cho bạn một sự chậm trễ hợp lý trên máy tính của riêng bạn)
Tôi tin rằng những thay đổi như vậy sẽ trực tiếp thực hiện với DOM, nhưng trình duyệt sẽ đợi cho đến khi quá trình thực thi JavaScript "không hoạt động" trước khi thực hiện bất kỳ thao tác nào. – pimvdb
"Thực hiện một số xử lý đang chạy dài" có một số cuộc gọi không đồng bộ? (ajax, settimeout etc) –
Tôi thực sự không thể thấy mã của bạn gặp vấn đề gì, vì có vẻ như bạn đã đăng tải. Có lẽ có một số '! Quan trọng' trong tập tin css bên ngoài của bạn. Bạn có chắc là class được thêm vào (bạn đã kiểm tra nó qua firebug) và quá trình này có thực sự kéo dài lâu không? có thể nó sẽ xảy ra quá nhanh –