Khi tôi sử dụng nút quay lại trên Firefox để truy cập trang đã truy cập trước đó, các tập lệnh trên trang đó sẽ không chạy lại.
Điều đó đúng và đó là một điều tốt.
Khi bạn nhấn vào một liên kết trong Firefox (và Safari và Opera), nó không phá hủy ngay trang của bạn để chuyển sang trang tiếp theo. Nó giữ cho trang nguyên vẹn, chỉ ẩn nó khỏi chế độ xem. Nếu bạn nhấn nút quay lại, nó sẽ đưa trang cũ trở lại xem mà không cần phải tải lại tài liệu; điều này nhanh hơn nhiều, dẫn đến chuyển tiếp trang trở lại / chuyển tiếp mượt mà hơn cho người dùng.
Tính năng này được gọi là bfcache .
Mọi nội dung bạn đã thêm vào trang trong quá trình tải trước đó của người dùng và sử dụng nội dung đó sẽ vẫn ở đó. Mọi trình xử lý sự kiện bạn đã đính kèm vào các phần tử trang sẽ vẫn được đính kèm. Mọi khoảng thời gian chờ / khoảng thời gian bạn đặt sẽ vẫn hoạt động. Vì vậy, hiếm khi có bất kỳ lý do gì bạn cần biết rằng bạn đã bị ẩn và hiển thị lại. Sẽ là sai khi gọi lại onload
hoặc nội dòng mã script, bởi vì bất kỳ liên kết và tạo nội dung nào mà bạn đã thực hiện trong hàm đó sẽ được thực thi lần thứ hai trên cùng một nội dung, với kết quả có thể thảm hại. (ví dụ: document.write
trong tập lệnh nội tuyến sẽ phá hủy hoàn toàn trang.)
Lý do viết thư window.onunload
có tác dụng là do các trình duyệt triển khai bfcache đã quyết định rằng - để tương thích với các trang thực sự cần biết khi nào chúng bị loại bỏ - bất kỳ trang nào tuyên bố quan tâm đến việc biết khi nào onunload
xảy ra sẽ khiến bfcache bị vô hiệu hóa. Trang đó sẽ được tải mới khi bạn quay lại, thay vì được tải từ bfcache.
Vì vậy, nếu bạn thiết lập window.onunload= function() {};
, những gì bạn thực sự đang làm là cố tình phá vỡ bfcache. Điều này sẽ dẫn đến việc các trang của bạn điều hướng chậm và không nên được sử dụng trừ khi là phương sách cuối cùng.
Nếu bạn cần biết khi nào người dùng rời đi hoặc quay lại trang của bạn, mà không làm rối bfcache, bạn có thể bẫy các sự kiện onpageshow
và onpagehide
thay thế:
window.onload=window.onpageshow= function() {
alert('Hello!');
};