Gần đây tôi đã tìm thấy câu hỏi sau trực tuyến:Làm thế nào để viết một chức năng mà gắn một mục vào DOM và trì hoãn đánh dấu tiếp theo?
Viết một hàm lấy đối tượng và nối nó vào DOM, làm cho nó được đệm cho đến lần đánh dấu tiếp theo? Giải thích tại sao điều này hữu ích?
Dưới đây là câu trả lời của tôi:
function appendElement(element) {
setTimeout(function() {
document.body.appendChild(element);
}, 0);
}
Tại sao tôi lại thiết lập khoảng thời gian về không?
Theo this article, đặt thời hạn thành 0, trì hoãn các sự kiện cho đến khi dấu chọn bên cạnh:
Việc thi hành func đi vào hàng đợi sự kiện trên bộ đếm thời gian đánh dấu gần nhất. Lưu ý, đó không phải là ngay lập tức. Không có hành động nào được thực hiện cho đến lần đánh dấu tiếp theo.
Đây là những gì tôi không chắc chắn của:
- là giải pháp của tôi có đúng không?
- tôi không thể trả lời tại sao phương pháp này là có lợi
Để tham khảo, tôi có câu hỏi này từ trang web này listing 8 JavaScript interview questions.
Tôi cũng muốn chỉ ra rằng tôi đang đặt câu hỏi này cho nghiên cứu và cải tiến của riêng tôi chứ không phải là một phần của thử thách mã, câu hỏi phỏng vấn hoặc bài tập về nhà.
Điều này sẽ cho phép bạn xem từng mục được thêm, từng mục một (tất nhiên là rất nhanh). Nếu bạn chỉ cần đặt nó trong một vòng lặp, trình duyệt sẽ đợi cho đến khi nó kết thúc trước khi vẽ lại màn hình. Đây là một ví dụ về sự đồng bộ. – Ian
Chỉ để làm rõ, bạn đang nói về chức năng được gọi là bên trong một vòng lặp, có? Ngoài ra, cách tiếp cận như vậy sẽ gây ra nhiều lần sơn lại, đúng không? –
Tôi xin lỗi, tôi không biết tại sao tôi cho rằng mã này đã được gọi trong vòng lặp. Tôi đọc lại ngay bây giờ. Tôi đoán điểm của tôi là nếu chức năng của bạn đang được gọi trong một vòng lặp (nói từ 0 đến 9), bạn sẽ/có thể thấy mỗi phần tử được nối thêm, bởi vì có một repaint vì chúng không đồng bộ. Nếu bạn không sử dụng 'setTimeout' và chỉ được gọi là' .appendChild' trong cùng vòng lặp 'for', bạn sẽ thấy tất cả chúng xuất hiện cùng một lúc, bởi vì mã đó là đồng bộ và sẽ chỉ có một lần lặp lại ở cuối. Tôi không chắc liệu đó là tất cả có liên quan nữa không :) – Ian