Как вызвать внешнюю функцию внутри onbeforeunload(), если пользователь решит покинуть страницу?

Я видел много примеров и пробовал их, когда указанная функция вызывается, если пользователь решает остаться на странице. Мне нужно вызвать внешнюю функцию непосредственно перед выгрузкой страницы, если пользователь решит покинуть страницу.

onbeforeunload = function(){
  if(user decides to leave the page){
      func1();
  }
  else {
    //Don't do anything
  }
}

Я пытался использовать «onunload», но мне нужно уведомить пользователя перед вызовом функции.

Заранее спасибо!


person arjunkm    schedule 25.08.2018    source источник
comment
Это невозможно. Пользователь не отвечает на приглашение до после возврата функции.   -  person Barmar    schedule 25.08.2018
comment
@Barmar Спасибо за информацию! Знаете ли вы, есть ли обходной путь для этого? Или какой-то другой способ добиться этого?   -  person arjunkm    schedule 25.08.2018
comment
Почему onunload не работает? Используйте onbeforeunload, чтобы вернуть строку подсказки, и если пользователь решит уйти, будет запущено onunload.   -  person Barmar    schedule 25.08.2018
comment
Не звоните confirm(), просто позвоните func1(). Пользователь уже подтвердил, что хочет уйти из-за функции onbeforeunload.   -  person Barmar    schedule 25.08.2018
comment
@Barmar запрашивает, подтверждает и блокирует предупреждения внутри onbeforeunload.   -  person arjunkm    schedule 25.08.2018
comment
Я знаю это. Вот почему вы должны использовать onbeforeunload для отображения подтверждения.   -  person Barmar    schedule 25.08.2018
comment
@Barmar Извините, если это нубский вопрос, но не могли бы вы сказать мне, что вы подразумеваете под возвратом строки приглашения?   -  person arjunkm    schedule 25.08.2018


Ответы (2)


Вы должны использовать как window.onbeforeunload, так и window.onunload. onbeforeunload возвращает строку, и это заставляет браузер отображать подтверждение перед выходом. Если пользователь подтвердит уход, сработает onunload, а затем вы сделаете то, что вам нужно, прежде чем страница будет выгружена.

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

Существуют ограничения на то, что вы можете делать в обоих этих обработчиках событий, потому что вам не разрешено запрещать пользователю покидать страницу, если он действительно этого хочет. Раньше вредоносное ПО использовало эти события для выполнения таких действий, как повторное открытие страницы, теперь это запрещено.

person Barmar    schedule 25.08.2018
comment
Спасибо за решение! Логически это имеет большой смысл. Однако, когда я пробовал, это не сработало. Я понял, что это может быть связано с тем, что func1() имеет асинхронные вызовы, и страница выгружается, прежде чем она сможет внести соответствующие обновления в базу данных и вернуться. Любые мысли о том, как я могу это решить? - person arjunkm; 27.08.2018
comment
Вот так. Возможно, вам придется использовать для этого что-то вроде веб-воркеров. - person Barmar; 27.08.2018
comment
Спасибо за предложение. Я рассмотрю возможность использования веб-воркеров. - person arjunkm; 27.08.2018

Похоже, вы пытаетесь запустить некоторый пользовательский код до того, как пользователь покинет страницу, если beforeunload не работает для вас, потому что браузер уходит до запуска вашего кода, вы можете вместо этого добавить прослушиватель событий mouseleave к document. Если мышь пользователя покидает документ, весьма вероятно, что он покидает вашу страницу (чтобы закрыть страницу, сменить вкладку, использовать другую программу на своем компьютере и т. д.).

document.addEventListener('mouseleave', () => {
	console.log('mouse left the document');
	// your code or function here
});

Попробуйте запустить приведенный выше фрагмент и навести указатель мыши на окно результатов и выйти из него.

person pretzelhammer    schedule 25.08.2018
comment
Спасибо за решение, хорошая мысль. Но я пытаюсь решить этот конкретный случай, поэтому событие mouseleave мне не поможет. - person arjunkm; 27.08.2018