2014-06-07 17 views
21

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.

+0

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ì. –

+0

@DavidMulder Tôi đã thêm trang jsbin để minh họa sự cố. – bitinn

+0

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. –

Trả lời

2

Bạn có thể thử gọi popstate trong khi tải trang trước đó không. Ví dụ, nếu bạn đang ở trang 1 và muốn chuyển sang trang 2, thay vì gọi trạng thái pop trong khi tải/sẵn sàng của trang 2, tại sao bạn không gọi trạng thái pop trong sự kiện dỡ tải của trang 1?

Bạn không chắc liệu nó có đáp ứng kịch bản của bạn hay không. Nhưng tôi đã không thể thử nó trong thùng rác của bạn.

+1

Theo như tôi biết, không có cách nào để gọi trực tiếp 'popstate', cách duy nhất là với 'history.back()' hoặc 'history.go (-n)'. Họ sẽ được xếp hàng đợi như đã đề cập. – bitinn

Các vấn đề liên quan