Коли я використовую кнопку "Назад" у Firefox, щоб перейти на попередньо відвідану сторінку, сценарії на цій сторінці не запускатимуться знову.
Це правильно, і це добре.
Коли ви натискаєте посилання у Firefox (і Safari, і Opera), це не відразу знищує вашу сторінку, щоб перейти до наступної. Він зберігає сторінку цілою, просто приховуючи її від очей. Якщо натиснути кнопку "Назад", вона поверне стару сторінку до перегляду, не завантажуючи документ знову; це набагато швидше, що призводить до плавніших переходів сторінки вперед / назад для користувача.
Ця функція називається bfcache .
Будь-який вміст, який ви додали на сторінку під час попереднього завантаження користувача та використання його, все одно буде там. Будь-які обробники подій, які ви прикріпили до елементів сторінки, все одно будуть прикріплені. Будь-які встановлені вами тайм-аути / інтервали все ще будуть активними. Тож рідко буває будь-яка причина, по якій вам потрібно знати, що вас сховали та показали знову. Було б неправильно onload
повторно викликати або вбудовувати код сценарію, тому що будь-яке прив'язування та генерація вмісту, яку ви зробили в цій функції, буде виконуватися вдруге над тим самим вмістом, що може мати катастрофічні результати. (наприклад,document.write
вбудований скрипт повністю знищить сторінку.)
Причиною того, що письмо до window.onunload
має ефект, є те, що браузери, що реалізують bfcache, вирішили, що - для сумісності зі сторінками, які дійсно повинні знати, коли їх відкидають - будь-яка сторінка, яка заявляє про зацікавленість знати, колиonunload
це відбудеться, спричинить bfcache бути інвалідом. Ця сторінка буде завантажена свіжою, коли ви повернетесь до неї, а не завантажені з bfcache.
Отже, якщо ви встановите window.onunload= function() {};
, те, що ви насправді робите, навмисно порушує bfcache. Це призведе до того, що ваші сторінки повільно орієнтуються, і їх не слід використовувати, крім як крайній захід.
Якщо вам потрібно знати, коли користувач залишає або повертається на вашу сторінку, не псуючи bfcache, ви можете замість цього захопити події onpageshow
та onpagehide
:
window.onload=window.onpageshow= function() {
alert('Hello!');
};