Запустити JavaScript-код у закритому вікні чи оновленні сторінки?


110

Чи є спосіб запустити остаточний код JavaScript, коли користувач закриває вікно браузера або оновить сторінку?

Я думаю про щось подібне на onload, але більше схоже на onclose? Дякую.

Мені не подобається метод onbeforeunload, який завжди поповнює спливаюче вікно підтвердження (залишити сторінку / залишитися на мозіллі) або (перезавантажити / не перезавантажувати на хром). Чи є спосіб виконати код спокійно?


1
Можливий дублікат: stackoverflow.com/questions/805463 / ...
1.44


18
Зачекайте - це насправді НЕ дублікат ... Він хоче знати, як виконати щось БЕЗ підказки користувачеві - пов'язані питання задають навпаки ...
Філдо

Відповіді:


84

Існує і те, window.onbeforeunloadі інше window.onunload, що використовується по-різному в залежності від браузера. Ви можете скористатися ними, встановивши властивості вікна на функції, або використовуючи .addEventListener:

window.onbeforeunload = function(){
   // Do something
}
// OR
window.addEventListener("beforeunload", function(e){
   // Do something
}, false);

Зазвичай onbeforeunloadвикористовується, якщо вам потрібно зупинити користувач не залишати сторінку (наприклад, користувач працює над деякими збереженими даними, тому перед відходом він повинен зберегти). Наскільки я знаю, onunloadне підтримується Opera , але ви завжди можете встановити і те, і інше.


Це працювало для мене: Firefox (69.0.2) та Chrome (77.0.3865.90)
FelipeCaparelli

51

Гаразд, я знайшов робоче рішення для цього, воно складається з використання beforeunloadподії, а потім змушення обробника повернення null. Це виконує потрібний код без спливаючого вікна підтвердження. Це щось подібне:

window.onbeforeunload = closingCode;
function closingCode(){
   // do something...
   return null;
}

Сподіваюся, це допомагає.


10
Хіба це не спрацьовує також під час навігації та під час оновлення (F5)? Якщо це так, це питання насправді не стосується ...
Jago

1
Не перевірено, але я думаю, що return false;робить те саме (тобто запобігає поведінці за замовчуванням), і це більш семантично правильно.
collimarco

1
return false все одно з’явиться у діалоговому вікні із запитом, хочете ви залишити сторінку чи ні. Я випробував це на якорі. При поверненні null діалог не вискочив, але все-таки зробив console.log
Ricky Stam

20

Іноді, можливо, ви захочете повідомити серверу, що користувач залишає сторінку. Це корисно, наприклад, для очищення збережених зображень, що зберігаються тимчасово на сервері, для позначення цього користувача як "офлайн" або для входу в журнал після закінчення сеансу.

Історично ви надіслали б запит AJAX у beforeunloadфункції, однак це має дві проблеми. Якщо ви надсилаєте асинхронний запит, немає гарантії, що запит буде виконано правильно. Якщо ви надсилаєте синхронний запит, він надійніший, але браузер буде зависати, поки запит не закінчиться. Якщо це повільний запит, це буде величезною незручністю для користувача.

На щастя, зараз у нас є navigator.sendBeacon(). За допомогою sendBeacon()методу дані передаються асинхронно на веб-сервер, коли Агент користувача має можливість це зробити, не затримуючи розвантаження або не впливаючи на роботу наступної навігації. Це вирішує всі проблеми з поданням аналітичних даних: дані надсилаються надійно, надсилаються асинхронно, і це не впливає на завантаження наступної сторінки. Ось приклад його використання:

window.addEventListener("unload", logData, false);

function logData() {
  navigator.sendBeacon("/log.php", analyticsData);
}

sendBeacon()це підтримується в:

  • Край 14
  • Firefox 31
  • Chrome 39
  • Сафарі 11.1
  • Опера 26
  • iOS Safari 11.4

Наразі НЕ підтримується в:

  • Internet Explorer
  • Opera Mini

Ось поліфайл для sendBeacon (), якщо вам потрібно додати підтримку непідтримуваних браузерів. Якщо метод недоступний у браузері, він надішле натомість синхронний запит AJAX.


Це запитання стосувалося справи "Надіслати запит серверу". Ідея полягала в тому, щоб мати змогу зберігати вкладки на відкритих вкладках на користувача та очищати їх під час запуску, коли вкладка закрита.
Пітер

@Peter Я включав його для повноти, але я видалив його.
Майк

@Mike, будь ласка, НЕ видаляйте свою відповідь. Він не тільки заповнює вибрану найкращу відповідь (вона повинна бути вашою), але також представляє подію, яка використовується для виходу з вікна або закриття
Alex8752

@ Alex8752 Я не видалив свою відповідь, я відредагував її частину, яка не стосується питання, який ви можете переглянути тут .
Майк

1
@AshokKumar Ви керуєте тим, що надсилаєте на сервер. Якщо ви хочете надсилати речі GET, нічого не заважає вам надсилати запит на щось подібне, http://example.com/script.php?token=something&var1=val1&var2=val2таким чином вкладаючи ці значення в GET.
Майк

14

Версія jQuery:

$(window).unload(function(){
    // Do Something
});

Оновлення : jQuery 3:

$(window).on("unload", function(e) {
    // Do Something
});

Дякую Гаррет


8

Документація тут заохочує прослуховування події перед завантаженням та / або додавання слухача події у вікно.

window.addEventListener('beforeunload', function(event) {
  //do something here
}, false);

Ви також можете просто заповнити властивості .onunload або .onbeforeunload за допомогою функції чи посилання на функцію.

Хоча поведінка не стандартизована у веб-переглядачах, функція може повернути значення, яке відобразиться у веб-переглядачі під час підтвердження того, залишати сторінку.


7

Можна використовувати window.onbeforeunload.

window.onbeforeunload = confirmExit;
function confirmExit(){
    alert("confirm exit is being called");
    return false;
}

3

Подія викликається beforeunload, тому ви можете призначити функцію window.onbeforeunload.


-2

Ви можете спробувати щось подібне:

<SCRIPT language="JavaScript">
<!--
function loadOut()
{
window.location="http://www.google.com";
}
//-->
</SCRIPT>

<body onBeforeUnload="loadOut()">

23
Остерігайтеся, люди читають це не в давні часи - це старовинні JS та HTML, а інші пропозиції тут набагато кращі.
RAnders00
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.