Sử dụng html5 window.history
API, tôi có thể kiểm soát điều hướng khá tốt trên ứng dụng web của mình.JS - window.history - Xóa trạng thái
Ứng dụng hiện có hai trạng thái: selectDate
(1) và enterDetails
(2).
Khi tải ứng dụng, tôi replaceState
và thiết lập một listener popState
:
history.replaceState({stage:"selectDate",...},...);
window.onpopstate = function(event) {
that.toStage(event.state.stage);
};
Khi một ngày được chọn và ứng dụng chuyển sang giai đoạn 2 Tôi đẩy trạng thái 2 vào stack:
history.pushState({stage:"enterDetails",...},...);
Trạng thái này được thay thế bất cứ lúc nào chi tiết thay đổi để chúng được lưu trong lịch sử.
Có ba cách để bỏ giai đoạn 2:
- tiết kiệm (ajax nộp)
- hủy
- nút quay lại
Các nút quay lại được xử lý bởi popstate
nghe. Nút hủy đẩy giai đoạn 1 để người dùng có thể quay lại chi tiết họ đang nhập vào nút quay lại. Cả hai đều hoạt động tốt.
Nút lưu sẽ hoàn nguyên về giai đoạn 1 và không cho phép người dùng điều hướng quay lại trang chi tiết (vì họ đã gửi). Về cơ bản, bạn nên đặt ngăn xếp lịch sử là length = 1.
Nhưng dường như không có history.delete()
hoặc history.merge()
. Điều tốt nhất tôi có thể làm là history.replaceState(stage1)
để lại ngăn xếp lịch sử là: ["selectDate","selectDate"]
.
Làm cách nào để loại bỏ một lớp?
Edit:
tưởng của cái gì khác, nhưng nó không hoạt động nữa.
history.back(); //moves history to the correct position
location.href = "#foo"; // successfully removes ability to go 'forward',
// but also adds another layer to the history stack
Điều này để ngăn xếp lịch sử là ["selectDate","selectDate#foo"]
.
Vì vậy, thay vào đó, có cách nào để xóa lịch sử 'chuyển tiếp' mà không cần đẩy trạng thái mới không?
Xin cảm ơn. Đó là khá thanh lịch hơn so với những gì tôi đã được sử dụng như một workaround. – slicedtoad
Việc cần làm khi người dùng quen với hành vi này, sau đó điều hướng vài lần để xây dựng trạng thái, sau đó điều hướng đến trang web bên ngoài, sau đó điều hướng trở lại và tôi giả sử lịch sử của tất cả điều hướng của ứng dụng hiện đã biến mất và nút quay lại sẽ là cuối cùng trên heap. –
Trạng thái được đẩy bởi history.pushState sẽ khả dụng khi chúng quay lại (cũng nếu chúng đóng hoặc làm mới trình duyệt của chúng). Một số trình duyệt sẽ kích hoạt sự kiện popstate khi tải trang, nhưng một số khác thì không (ví dụ Firefox). Nhưng bạn luôn có thể đọc history.state trực tiếp. Nếu bạn không sử dụng đối tượng history.state, bạn sẽ cần sử dụng một phương tiện khác để duy trì trạng thái của bạn (như localStorage). history.state được tiếp tục tự động như là một phần của lịch sử duyệt web. –