2016-08-05 4 views
0

Возможно ли изменить DOM в обработчике beforeunload? Chrome, похоже, применяет модификации DOM после пользователь нажал «остаться» в браузере, чтобы оставить страницу, и я хочу, чтобы часть страницы была скрыта. пока это предупреждение видно.изменение DOM в beforeunload в Chrome

Смотреть демо:

<script> 
window.onbeforeunload = function(e){ document.getElementById('a').style.display = "none"; e.returnValue = "adios";} 
</script> 
<div id=a >This text should disappear when the user tries to leave the page</div> 

https://jsfiddle.net/qmatic/6sLp7rmq/

Единственное решение, которое я до сих пор является анимировать дел до непрозрачности: 0 и иметь код в setInterval, который постоянно сбрасывает эту анимацию. Пока код работает, div всегда отображается. Chrome останавливает весь код, когда он показывает предупреждение, поэтому анимация, наконец, работает до конца и скрывает div. Но это ужасное решение - я постоянно обновляю DOM для сброса анимации. У кого-нибудь есть лучшие идеи?

+0

Вы пытались изменить css ** перед тем, как ** установить обработчик событий вместо того, чтобы делать это внутри обработчика? – Gunnar

+0

Когда мне это делать? Я реагирую на пользователя, пытающегося покинуть страницу. Как узнать, что пользователь пытается покинуть страницу (например, набрав что-то в адресной строке) перед тем, как будет запущена перезагрузка перед загрузкой? – Anton

ответ

0

Процесса выполняется с помощью Chrome, как представляется:

1) вызывает обработчик, ожидая синхронно для ее возвращаемого значения

2), если возврат (event.returnValue) соответствующим образом определен, продолжить выгрузить

3) в противном случае представляет собой модное всплывающее окно, получая разрешение пользователя на отмену навигации.

4) если навигация отменена, оставайтесь на странице и применяйте цикл обновления к просмотру страницы.

Я прошел через обработчик onbeforeunload в отладчике, и когда я это сделаю, изменения стиля WILL вступят в силу до появления модального диалога, а не после его закрытия. Это, по-видимому, указывает на то, что использование отладчика вводит дополнительные циклы обновления DOM, которые в противном случае не выполнялись бы при нормальной работе. Я пытаюсь найти способ сделать один из этих циклов обновления программным путем изнутри обработчика, но пока не повезло.

В других браузерах, как представляется, существуют циклы обновления, вставленные между этапами 1-4 выше, что дает желаемое поведение.

+0

Любой успех при получении обновления, вызванного перед модальным диалогом? –

+0

Мы решили отказаться от усилий по захвату, прежде чем перегружать и обрабатывать его специально; существует множество способов, которыми пользователь может отключиться от сеанса приложения, который не будет запускать событие. У нашей команды были лучшие результаты, единообразно устраняя все непреднамеренные отключения. –

+0

Хорошо, спасибо. Вероятно, мы тоже не будем использовать onbeforeunload. Хотя наш прецедент был просто для отображения пользовательского сообщения для пользователя «за всплывающим окном браузера», которое можно было прочитать через прозрачное оверлея и закрыть вместе с всплывающим окном, которое работало в Firefox, но не в Chrome. –