При веб-разработке мы часто используем событие закрытия страницы onbeforeunload, которое может дать пользователям возможность отказаться от закрытия, как в этом редакторе блога. Если пользователь решит выйти, событие onunload, естественно, сработает, но если пользователь решит отменить, как это обнаружить?
Мы предполагаем, что страница оставляет событие отмены, называемое onunloadcancel. Очевидно, что это событие должно сработать после того, как пользователь нажмет кнопку «Отмена» в диалоговом окне. Но процесс запуска закрытия диалогового окна подсказки не так прост. Давайте сначала рассмотрим процесс:
Скопируйте код кода следующим образом:
window.onbeforeunload = функция()
{
return «Правда ухожу?»;
}
Когда пользователь готов покинуть страницу (например, нажать кнопку закрытия, обновить страницу и т. д.), запускается событие onbeforeunload. Наш скрипт не может решить, следует ли запретить закрытие страницы в этом случае. Единственное, что он может сделать, это вернуть строку. Эта строка отображается только в виде поясняющего текста в диалоговом окне закрытия выбора. Пользователь может выбрать закрытие или не закрытие. . Но какой из них выбрать, мы не знаем.
Однако если внимательно проанализировать этот вопрос, то на самом деле это не так. Если пользователь действительно решит закрыть страницу, то весь работающий код будет удален, и если пользователь продолжит оставаться на странице, это будет считаться так, как будто ничего не произошло, за исключением события onbeforeunload; Поэтому мы делаем небольшую хитрость в событии onbeforeunload и прописываем здесь таймер, который запустится через несколько миллисекунд. Если страница действительно закрыта, то конечно таймер будет невалидным, тогда страница все равно будет, и задержка будет. в течение нескольких миллисекунд. В этом изначально асинхронном событии взаимодействия интерфейса ошибки нет.
Скопируйте код кода следующим образом:
<script Language="JavaScript">
window.onbeforeunload = функция()
{
setTimeout (onunloadcancel, 10);
return «Правда ухожу?»;
}
window.onunloadcancel = функция()
{
alert("Отменить выход");
}
</скрипт>
Мы используем setTimeout и задержку 10 мс для выполнения onunloadcancel. Если страница действительно закрыта, таймеры, конечно, будут уничтожены, в противном случае продолжайте; Но в ходе тестирования было обнаружено, что в FireFox есть две ошибки:
Иногда при нажатии кнопки закрытия также выполняется onunloadcancel, и появляется диалоговое окно. Если вы перейдете на while(1); браузер останется зависшим, а это означает, что onunloadcancel действительно выполняется, но только уничтожает интерфейс, но не приостанавливает выполнение скрипта.
Если вы уйдете, обновив страницу, onbeforeunload будет выполнен только один раз, но если вы нажмете кнопку X, чтобы закрыть страницу, onbeforeunload будет выполнен дважды. Поэтому нам все еще нужно улучшить его, чтобы он был совместим с FF.
Скопируйте код кода следующим образом:
<script Language="JavaScript">
вар_т;
window.onbeforeunload = функция()
{
setTimeout(function(){_t = setTimeout(onunloadcancel, 0)}, 0);
return «Правда ухожу?»;
}
window.onunloadcancel = функция()
{
ClearTimeout (_t);
alert("Отменить выход");
}
</скрипт>
Здесь используется метод, причину которого я не могу объяснить. Его следует рассматривать как хак для устранения ошибки в FF.