Câu hỏi này nghe có vẻ lạ, vì hầu hết thời gian popstate được kích hoạt đồng bộ khi người dùng nhấn nút quay lại.Cách xử lý nút quay lại khi trình duyệt không kích hoạt sự kiện popstate ngay lập tức
Tuy nhiên, thông số W3C cho biết rằng UA (trình duyệt) được phép xếp hàng popstate khi traversing history (xem mục 14), tức là. popstate
được kích hoạt không đồng bộ (mặc dù URL đã thay đổi tại thời điểm này).
Nhà cung cấp trình duyệt diễn giải và triển khai thông số này khác nhau. Mozilla decides Firefox sẽ có thể kích hoạt popstate
trước load
và vì lý do tốt để hình ảnh chậm sẽ không chặn popstate
.
Chrome/Safari quyết định khác, và nó dẫn vấn đề của chúng tôi:
Khi quản lý lịch sử cho một ứng dụng web, nó thường mong muốn khởi quản lý lịch sử càng sớm càng tốt, ví dụ như. tại DOMContentLoaded
thay vì load
. Nhưng đổi lại, người dùng không thể thoát ra khỏi bất kỳ pushState
, bởi vì tất cả popstate
được xếp hàng đợi cho đến load
.
Chúng tôi đang tìm kiếm lời khuyên cho các cách xử lý kịch bản như vậy. Tôi tự nghĩ ra:
- Hình ảnh tải xuống, vì vậy
load
có thể kích hoạt càng sớm càng tốt. - Giao diện người dùng khối cho đến khi
load
được kích hoạt. - Init framework on
load
thay vìDOMContentLoaded
.
Có giải pháp nào tốt hơn không?
Cập nhật: Mọi thứ trở nên xấu xí khi có ajax rằng lửa trước load
, nếu những kết quả yêu cầu trong DOM thay đổi, và sự thay đổi DOM xảy ra để có một số hình ảnh, load
bị trì hoãn cho đến khi những hình ảnh được nạp/thời gian chờ, có nghĩa popstate
được xếp hàng lâu hơn nữa.
Cập nhật 2: Để thêm một bản demo đơn giản cho nó, hãy truy cập jsbin page này với chrome và xem popstate
sẽ bị chặn cho đến khi load
là bắn. Bạn có thể so sánh kết quả giữa hình ảnh được lưu trong bộ nhớ cache và hình ảnh không được đính kèm.
Khi sử dụng nút quay lại 'popstate' sẽ luôn kích hoạt ngay lập tức. Trường hợp duy nhất mà nó không cháy là khi bạn làm mới, nhưng trong trường hợp đó bạn tốt nhất dựa trên URI theo cách nào đó (đó là điểm làm mới). Tôi phải thiếu một cái gì đó, nhưng không chắc chắn những gì. –
@DavidMulder Tôi đã thêm trang jsbin để minh họa sự cố. – bitinn
Ah, ít nhất tôi có được bây giờ mà bạn đang bắn một sự thay đổi trạng thái lịch sử trước khi 'tải' đã xảy ra ... tại sao trên thế giới là bạn làm điều đó?Chỉ người dùng mới có thể thay đổi trạng thái và lần đầu tiên ứng dụng tải nút quay lại không nên có bất kỳ trạng thái cụ thể nào của ứng dụng trước đó, vì vậy tôi hoàn toàn nhầm lẫn với những gì bạn đang cố gắng thực hiện. –