Как выполнить что-то внутри window.onbeforeunload = function (e) {..} в Chrome? - PullRequest
3 голосов
/ 30 марта 2012

Как упомянуто LapinLove404 в window.onbeforeunload, не работающем в chrome , кажется, что в Chrome внутри функции beforeunload невозможно сделать что-либо еще, кроме изменения подтверждающее сообщение.

Следующий код работает в FF и IE, но не в Chrome:

<html>
<head>
<script type="text/javascript">
 window.onbeforeunload = function sair() {
  alert("This alert doesn't show up in Chrome");
  return "If you leave this page your data will be lost!";
 }
</script>
</head>
<body>
 <a href="http://www.example.com"> Leave the page </a>
</body>
</html>

Как я могу что-то сделать, прежде чем пользователь покинет страницу? Например, если мне нужно было сохранить состояние страницы с помощью асинхронного вызова или снять ранее установленную блокировку. Я думаю, что есть много вариантов его использования, но, к сожалению, Chrome не делает это тривиальной задачей. Есть идеи для обхода?

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Я полагаю, что вы можете устанавливать файлы cookie, записывать в хранилище HTML5 и т. Д. Но по соображениям безопасности и отказа в обслуживании вы не можете выполнять определенные действия, такие как запрос пользователя, установка window.location и т. Д.вещи, которые могут лишить пользователя возможности перейти на веб-страницу, к которой он обратился.

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

Существуют другие подобные методы, включающие номера ID изменения или идентификаторы редакции вместо копии старых данных.

2 голосов
/ 30 марта 2012

Функциональность onbeforeunload очень ограничена.Я думаю, что самое большее, что вы можете сделать, это вернуть сообщение.Вы не можете помешать кому-то покинуть вашу страницу.Вы не можете выполнить любой код в onbeforeunload.Вы можете попробовать onunload для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...