Можно ли программно запускать событие onbeforeunload?

В настоящее время я использую плагин jquery-form-observe, который использует onbeforeunload для запроса пользователю о "несохраненных" изменениях.

Но у меня есть сценарий, когда мне нужно вызвать это нажатием кнопки: нажатие кнопки в конечном итоге приводит к изменению страницы, но я хочу пригласить пользователя, прежде чем они начнут процесс, когда кнопка будет нажата...

Итак, есть способ вызвать onbeforeunload через jQuery или иначе?

Ответ 1

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

function triggerBeforeUnload() {
  var event = {};
  handler(event);

  if (typeof event.returnValue == 'undefined' ||
      confirm('Are you sure you want to navigate away from this page?\n\n' + event.returnValue + '\n\nPress OK to continue, or Cancel to stay on the current page.')) {
    // Continue with page unload
  } else {
    // Cancel page unload
  }
}

Изменить: В jquery.formobserver.js, сразу после определения function beforeunload(e) { ... }, добавьте эту строку:

handler = beforeunload;

Обратите внимание на изменение исходного кода: window.onbeforeunload был заменен на handler.

Ответ 2

Вы можете сделать это с помощью . trigger() метод:

$('button').click(function(){
    $(window).trigger('beforeunload');
});

Ответ 3

Я наткнулся на этот вопрос, ища ответы на свой собственный вопрос, который был похож по своему характеру. Итак, я придумал обходной путь здесь. Мне нужно было вызвать "onbeforeunload" только тогда, когда пользователь нажимает на определенную кнопку и ни один из остальных. Надеюсь, это проливает свет на ваш вопрос.

Я получил его для работы в jsfiddle. Вы можете протестировать его там в демо, который я установил, и ясно видеть, что он работает только с одной из кнопок. Однако есть одно предостережение, за которое я не потрудился искать исправление. Если вы нажмете на кнопку и решите остаться на странице, то все последующие кнопки/ссылки/перенаправления/перезагрузки вызовут "onbeforeunload". Вы можете придумать свою собственную работу для "ошибки" (из-за отсутствия лучшего термины), чтобы сделать это так, чтобы это не вызвало эту реакцию, если пользователь решил остаться на странице. Однако он работает и выполняет то, что вы просили, чтобы он выполнял в тестовой среде.

Здесь код:

$(document).ready(function () {
        $('.testButton').click(function () {
            window.onbeforeunload = function () {
                return "Enter your message here...";
            }
        });
    });

EDIT:

Итак, после изучения других способов сделать то же самое, я столкнулся с другим способом связать событие с кнопкой, используя метод jQuery.on(). Код можно увидеть здесь, убедитесь, что старый код закомментирован. Опять же, такая же "ошибка", как и раньше, но по-прежнему предоставляет функциональные возможности, которые были запрошены.

Здесь альтернатива:

$(document).ready(function () {
        $('.testButton').on("click", function (event) {
            window.onbeforeunload = function () {
                return "Enter your message here...";
            }
        });
    });