À, nút quay lại. Bạn có thể tưởng tượng "back" kích hoạt một sự kiện JavaScript mà bạn có thể chỉ cần hủy như vậy:
document.onHistoryGo = function() { return false; }
Không phải vậy. Đơn giản là không có sự kiện nào như vậy.
Nếu bạn thực sự có một ứng dụng web (thay vì chỉ một trang web với một số tính năng ajaxy) thì việc sử dụng nút quay lại (với các đoạn trên URL, như bạn đã đề cập) là hợp lý. Gmail thực hiện điều này. Tôi đang nói về thời điểm ứng dụng web của bạn trong một trang, tất cả đều độc lập.
Kỹ thuật này rất đơn giản - bất cứ khi nào người dùng thực hiện hành động sửa đổi mọi thứ, hãy chuyển hướng đến cùng một URL mà bạn đã truy cập, nhưng với một đoạn băm khác. Ví dụ
window.location.hash = "#deleted_something";
...
window.location.hash = "#did_something_else";
Nếu trạng thái tổng thể của ứng dụng web của bạn có thể được băm, đây là một nơi tuyệt vời để sử dụng hàm băm. Giả sử bạn có một danh sách các email, có thể bạn sẽ nối tất cả các ID của chúng và các trạng thái đã đọc / chưa đọc và lấy một mã băm MD5, sử dụng nó làm mã nhận dạng phân đoạn của bạn.
Loại chuyển hướng này (chỉ băm) không cố gắng tìm nạp bất kỳ thứ gì từ máy chủ, nhưng nó chèn một vị trí trong danh sách lịch sử của trình duyệt. Vì vậy, trong ví dụ trên, người dùng nhấn "back" và họ hiện đang hiển thị #deleted_something trên thanh địa chỉ. Họ đánh lại một lần nữa và họ vẫn ở trên trang của bạn nhưng không có băm. Sau đó quay lại lần nữa và họ thực sự quay trở lại, đến bất cứ nơi nào họ đến.
Tuy nhiên, bây giờ là phần khó, việc JavaScript của bạn phát hiện khi nào người dùng đánh trả (để bạn có thể hoàn nguyên trạng thái). Tất cả những gì bạn làm là xem vị trí cửa sổ và xem khi nào nó thay đổi. Với thăm dò ý kiến. (Tôi biết, yuck, thăm dò ý kiến. Chà, không có gì tốt hơn trình duyệt chéo ngay bây giờ). Mặc dù vậy, bạn sẽ không thể biết họ tiến hay lùi, vì vậy bạn sẽ phải sáng tạo với số nhận dạng băm của mình. (Có lẽ một băm được nối với một số thứ tự ...)
Đây là ý chính của mã. (Đây cũng là cách plugin Lịch sử jQuery hoạt động.)
var hash = window.location.hash;
setInterval(function(){
if (window.location.hash != hash) {
hash = window.location.hash;
alert("User went back or forward to application state represented by " + hash);
}
}, 100);