Мне нужно предупредить пользователей о несохраненных изменениях, прежде чем они покинут страницу (довольно распространенная проблема).
window.onbeforeunload=handler
Это работает, но вызывает диалоговое окно по умолчанию с раздражающим стандартным сообщением, которое оборачивает мой собственный текст. Мне нужно либо полностью заменить стандартное сообщение, чтобы мой текст был чистым, либо (что еще лучше) заменить весь диалог модальным диалогом с использованием jQuery.
Пока что я потерпел неудачу, и я не нашел никого, кто, кажется, имеет ответ. Это вообще возможно?
Javascript на моей странице:
<script type="text/javascript">
window.onbeforeunload=closeIt;
</script>
Функция closeIt ():
function closeIt()
{
if (changes == "true" || files == "true")
{
return "Here you can append a custom message to the default dialog.";
}
}
Используя jQuery и jqModal, я пробовал подобные вещи (используя пользовательский диалог подтверждения):
$(window).beforeunload(function() {
confirm('new message: ' + this.href + ' !', this.href);
return false;
});
что также не работает - я не могу связываться с событием beforeunload.
Ответы:
Вы не можете изменить диалог по умолчанию для
onbeforeunload
, поэтому лучше всего работать с ним.Вот ссылка на это от Microsoft:
Кажется, проблема в следующем:
onbeforeunload
вызывается, он будет принимать возвращаемое значение обработчика какwindow.event.returnValue
.false
он анализируется как строка, диалоговое окно будет запущено, которое затем передаст соответствующийtrue
/false
.Результат, как представляется , не быть способом назначения
false
дляonbeforeunload
предотвращения его от диалога по умолчанию.Дополнительные примечания по jQuery:
onbeforeunload
событиям. Если вы хотите, чтобы событие unload происходило, я бы остановился на обычном JavaScript.У jQuery нет ярлыка,
onbeforeunload
поэтому вам придется использовать общийbind
синтаксис.Изменить 09/04/2018 : пользовательские сообщения в диалогах onbeforeunload устарели начиная с chrome-51 (см. Примечание к выпуску )
источник
Что сработало для меня, используя jQuery и протестировано в IE8, Chrome и Firefox, так это:
Важно ничего не возвращать, если подсказка не требуется, поскольку здесь есть различия между IE и другими режимами работы браузера.
источник
event.returnValue
что это единственный «одобренный» метод в IE. IE продолжает: «Значение этого свойства имеет приоритет перед значениями, возвращаемыми функцией, например, с помощью оператора возврата Microsoft JScript». .. было бы неплохо увидеть гарантированную корреляцию междуreturn
(из события) иevent.returnValue
..Несмотря на то, что в некоторых случаях вы ничего не можете с этим поделать, вы можете перехватить кого-нибудь, щелкнув по ссылке. Для меня это стоило усилий для большинства сценариев, и как запасной вариант, я оставил событие unload.
Я использовал Boxy вместо стандартного диалога jQuery, он доступен здесь: http://onehackoranother.com/projects/jquery/boxy/
Вы можете присоединиться к другому событию и отфильтровать больше информации о том, на какой вид якоря щелкнули, но это работает для меня и того, что я хочу сделать, и служит примером для использования или улучшения другими. Думал, что поделюсь этим для тех, кто хочет это решение.
Я вырезал код, так что это может не работать как есть.
источник
1) Используйте перед загрузкой, а не загрузкой.
2) Важно избегать выполнения оператора return. Я не имею в виду, чтобы избежать возвращения из вашего обработчика. Вы вернете все правильно, но вы сделаете это, убедившись, что достигли конца функции и НЕ выполняете инструкцию возврата. При этих условиях встроенный стандартный диалог не появляется.
3) Если вы используете onbeforeunload, вы можете запустить ajax-вызов в своем обработчике unbeforeunload, чтобы привести в порядок сервер, но он должен быть синхронным, и вам придется ждать и обрабатывать ответ в своем обработчике onbeforeunload (все еще соблюдая условие (2) выше). Я делаю это, и это прекрасно работает. Если вы делаете синхронный вызов ajax, все задерживается до тех пор, пока ответ не вернется. Если вы делаете асинхронный ответ, думая, что вам не нужен ответ от сервера, выгрузка страницы продолжается, и ваш процесс ajax прерывается этим процессом - включая удаленный скрипт, если он выполняется.
источник
Попробуйте разместить
return;
вместо сообщения ... это работает большинство браузеров для меня. (Это только действительно мешает подаркам диалога)источник
null
откроет диалог с текстом «ноль». Однакоreturn void(0);
не откроет диалог.Это не может быть сделано в Chrome сейчас, чтобы избежать спама, обратитесь к javascript onbeforeunload, не показывающему пользовательское сообщение для получения дополнительной информации.
источник
Вы можете определить, какая кнопка (ок или отмена) нажата пользователем, потому что функция onunload вызывается только тогда, когда пользователь выбирает покинуть страницу. Хотя в этой функции возможности ограничены, потому что DOM рушится. Вы можете запустить javascript, но ajax POST ничего не делает, поэтому вы не можете использовать этот метод для автоматического выхода из системы. Но для этого есть решение. Window.open ('logout.php') выполняется в функции onunload, поэтому пользователь выходит из системы с открытием нового окна.
Этот код вызывается, когда пользователь покидает страницу или закрывает активное окно и пользователь выходит из системы с помощью logout.php. Новое окно закрывается сразу, когда выход php состоит из кода:
источник
Я столкнулся с той же проблемой, я был в порядке, чтобы получить свое собственное диалоговое окно с моим сообщением, но проблема, с которой я столкнулся, была: 1) Он давал сообщение на всех навигациях, я хочу это только для близкого щелчка. 2) с моим собственным подтверждающим сообщением, если пользователь выбирает отмену, оно по-прежнему отображает диалоговое окно браузера по умолчанию.
Ниже приведен код решения, который я нашел и написал на своей главной странице.
источник
обратитесь с http://www.codeprojectdownload.com
источник
Как насчет использования специализированной версии команды «связать» «один». Как только обработчик событий выполняется в первый раз, он автоматически удаляется как обработчик событий.
источник
.one()
- это прикрепляет прослушиватель событий для прослушивания события, которое происходит только один раз: «Присоединить обработчик к событию для элементов. Обработчик выполняется не более одного раза для каждого элемента для каждого типа события». api.jquery.com/oneУгловой 9 подход:
Поддержка браузеров и удаление пользовательских сообщений:
источник