window.onunload некорректно работает в браузере Chrome. Может кто-нибудь мне помочь?

Я написал этот код

function winUnload() {
    alert("Unload Window");
    MyMethod();
}

window.onunload = function() { winUnload(); }

Этот код отлично работает в IE и Firefox. Но этот код не работает в Chrome. Оба оператора alert("Unload Window"); и MyMethod(); не работают.


person Imran    schedule 17.10.2011    source источник
comment
В опубликованном вами коде есть синтаксическая ошибка (отсутствует {из назначения onunload). Вы можете просто написать window.onunload = winUnload;.   -  person Pointy    schedule 17.10.2011
comment
В Chrome, если я помещаю alert в unload обработчик событий, консоль сообщает мне о заблокированном предупреждении («что-то») во время выгрузки. Но если вы сделаете то, что уже упоминал Пойнти, вызов MyMethod должен сработать.   -  person James Allardice    schedule 17.10.2011
comment
Современные браузеры блокируют большинство скриптов, выполняемых при загрузке, поэтому браузер работает быстрее.   -  person epascarello    schedule 17.10.2011
comment
window.onunload = функция () {winUnload (); } Вот что я хочу сказать ... Он работает так же, как мы пишем: window.onunload = winUnload;   -  person Imran    schedule 17.10.2011
comment
На самом деле я хочу сохранить значения моих форм в базе данных, если пользователь покидает страницу, не показывая ему никаких сообщений (предупреждений). Я использую asp.net c # mvc 1. Есть ли другой способ выполнить эту работу?   -  person Imran    schedule 18.10.2011
comment
Попробуйте: ‹body onunload = unload ()›   -  person Kristian    schedule 14.09.2016


Ответы (7)


Внутри события выгрузки есть некоторые действия, которые не работают в Chrome. Коробки с предупреждением или подтверждением - это такие вещи.

Но что возможно (AFAIK):

  1. Открывать всплывающие окна (с помощью window.open) - но это будет работать, если блокировщик всплывающих окон отключен для вашего сайта
  2. Верните простую строку (в событии beforeunload), которая запускает окно подтверждения, которое спрашивает пользователя, хочет ли он покинуть страницу.

Пример для №2:

$(window).on('beforeunload', function() {
    return 'Your own message goes here...';
});

Демо: http://jsfiddle.net/PQz5k/

person Armin    schedule 17.02.2012
comment
@Armin - хороший улов. Спасибо. я расширил ваш код, чтобы не беспокоить пользователя при отправке формы и внутренней навигации: jsfiddle.net/5wyr2u5x - person Tohid; 15.02.2015
comment
В последней версии Chrome я понял, что сообщение больше не индивидуальное. На странице написано: «На странице есть несохраненные изменения, вы действительно хотите выйти?». У меня есть сообщение на немецком языке, поэтому я свободно перевел его ^^ - person Armin; 15.11.2016
comment
@Armin можно ли вызвать окно подтверждения только при закрытии вкладки? - person user6016913; 31.03.2018

Я знаю, что это старый, но я нашел способ сделать выгрузку с помощью Chrome

window.onbeforeunload = function () {
  myFunction();
};
person Carlos    schedule 11.09.2015
comment
myFunction () - будет вызываться 2 раза! Лучше только перед загрузкой: window.onbeforeunload = (function(){ myFunction() }) - person egor.xyz; 05.03.2017
comment
window.onbeforeunload = myFunction; это лучше - person Jordi Jordi; 23.09.2018
comment
Функция внутри onbeforeunload вызывает первый раз, когда страница обновляется / загружается. Если я обновляю страницу снова, она не срабатывает. Где я пропустил? - person sam ruben; 19.09.2019

Ответ Армина очень полезен, спасибо. №2 - это то, что наиболее важно знать при попытке настроить события выгрузки, которые работают в большинстве браузеров: вы не можете alert () или confirm (), но при возврате строки будет генерироваться модальное окно подтверждения.

Но я обнаружил, что даже при простом возврате строки у меня были некоторые проблемы с кроссбраузерностью, характерные для Mootools (в данном случае используется версия 1.4.5). Эта специфичная для Mootools реализация отлично работала в Firefox, но не вызвала всплывающего окна подтверждения в Chrome или Safari:

window.addEvent("beforeunload", function() {
    return "Are you sure you want to leave this page?";
});

Итак, чтобы мое событие onbeforeonload работало в разных браузерах, мне пришлось использовать собственный вызов JavaScript:

window.onbeforeunload = function() {
    return "Are you sure you want to leave this page?";
}

Не уверен, почему это так, и было ли это исправлено в более поздних версиях Mootools.

person Tracy    schedule 22.06.2015
comment
В 2017 году этот обходной путь отображает сообщение, но не сообщение, которое я хочу, поэтому я должен проголосовать за то, чтобы дать мне что-то, с чем можно работать: D - person Callat; 24.04.2017

Вы можете попробовать использовать событие pagehide для Chrome and Safari.

Проверьте эти ссылки:

Как определить поддержку браузером для pageShow и pageHide?

http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

person Leonardo Calzavara    schedule 28.03.2012

Попробуйте window.onbeforeunload вместо window.onunload для Chrome. Вы также можете попробовать вызвать onbeforeunload из тега body>, который может работать в Chrome.

Однако у нас есть проблема с функцией выгрузки в браузере Chrome. пожалуйста, проверьте

location.href делает не работает в Chrome при вызове через событие выгрузки тела / окна

person Nivedittan    schedule 16.11.2011

Событие onunload не сработает, если событие onload не сработало. К сожалению, событие onload ожидает загрузки всего двоичного содержимого (например, изображений) , и встроенные скрипты выполняются до срабатывания события onload. DOMContentLoaded срабатывает, когда страница видна, перед загрузкой делает. И теперь это стандарт в HTML 5, и вы можете проверить поддержку браузера, но обратите внимание, что для этого требуется <!DOCTYPE html> (по крайней мере, в Chrome). Однако я не могу найти соответствующее событие для выгрузки DOM. И такое гипотетическое событие может не сработать, потому что некоторые браузеры могут поддерживать DOM для выполнения функции «вкладки восстановления».

Единственное возможное решение, которое я нашел до сих пор, - это API видимости страницы, который, похоже, требует <!DOCTYPE html>.

person Shelby Moore III    schedule 03.03.2013

Это работает :

var unloadEvent = function (e) {
    var confirmationMessage = "Warning: Leaving this page will result in any unsaved data being lost. Are you sure you wish to continue?";
    (e || window.event).returnValue = confirmationMessage; //Gecko + IE
    return confirmationMessage; //Webkit, Safari, Chrome etc.
};
window.addEventListener("beforeunload", unloadEvent);
person Amulya Kashyap    schedule 07.03.2016