как изменить событие beforeunload в javascript

Возможен ли вызов функции ajax до того, как кто-то решит покинуть страницу. Я имею в виду, что могу спросить пользователя, хочет ли он уйти или остаться. Но я не знаю, как изменить поведение, когда пользователь нажимает кнопку «да, покинуть страницу».

У меня этот код работает..

<head>
<script type="text/javascript">
    function catchExit() {
        return "All your data is going to be lost. Are you sure??";
    }
</script>
</head>
<body onbeforeunload="return catchExit()">
<p>
    Dont leave the page.
</p>
</body>

person DonkeyKong    schedule 18.08.2012    source источник
comment
Короткий ответ: вы не можете. Если они выбрали да, они выключены и работают. Однако вы можете наложить confirm до того, как он по умолчанию будет вести себя в браузере.   -  person Brad Christie    schedule 18.08.2012


Ответы (2)


Вот альтернативный способ использования confirm:

function catchExit(){
  var exit = confirm("Are you sure?");
  if (exit){
  }
}

Но имейте в виду, что AJAX не может остановить поток. Это означает, что нет никакой гарантии, что вызов:

  1. Делает это
  2. успешно
  3. Возврат результата

Окно покажет подсказку и/или закроется до того, как AJAX, возможно, даже завершится. Чтобы проиллюстрировать это лучше:

function catchExit(){
  $.ajax({
    success: function(){
      // this is an entirely new thread and returning a result
      // has ZERO effect on the original catchExit function
      // (And chances are it's already executed and is long gone)
    }
  });
  // this (99.99% of the time) will be called long before
  // 'success' above is called, therefore making 'success' and its
  // outcome moot.
  return "There are unsaved changes, are you sure you want to exit?";
}
person Brad Christie    schedule 18.08.2012
comment
Что, если это был синхронный запрос? - person Jared Farrish; 18.08.2012

На самом деле, я нашел способ заставить мой $.ajax() вызов работать. Установка для параметра async значения false работает в Firefox, Chrome, iexplorer и Safari. Только в опере не работает.

person DonkeyKong    schedule 20.08.2012