ASP.NET дважды вызывает событие onBeforeUnload - PullRequest
7 голосов
/ 25 ноября 2008

Я разместил это здесь , но подумал, что это может заслуживать отдельного вопроса.

То, что я пытаюсь сделать, это показать диалоговое окно, которое спрашивает пользователя, хочет ли он / она покинуть страницу, если есть несохраненные изменения. Это все работает отлично. Но проблема описана ниже:

Кто-нибудь сталкивался с проблемой, когда Internet Explorer дважды запускает событие onbeforeunload? Пока гуглил, я обнаружил, что это как-то связано с тем, что для (среди прочего) кнопки ссылок ASP.NET HTML-код равен <a href="javascript: __doPostBack....

Очевидно, что когда IE получает ссылку, которая не имеет href="#", он запускает событие onbeforeunload. Затем, когда вы подтвердите диалоговое окно javascript, которое мы показываем, страница выполнит «настоящую» выгрузку для перехода на другую страницу и вызовет событие onbeforeunload во второй раз.

Решение, предлагаемое в Интернете, заключается в установке логической переменной и проверке ее перед отображением диалогового окна. Так что во второй раз это не будет показано. Это все хорошо, но когда пользователь отменяет, переменная все равно будет установлена. Поэтому в следующий раз, когда пользователь захочет покинуть страницу, диалоговое окно больше не будет отображаться.

Надеюсь, это немного ясно, и я надеюсь, что кто-то нашел способ обойти это?

Ответы [ 3 ]

10 голосов
/ 25 ноября 2008

В ответ на annakata: Да, но вы хотите, чтобы браузер использовал результат этого диалогового окна. Поэтому вы можете подумать, что использование return bFlag поможет (или event.returnValue = bFlag), но это дает вам второе диалоговое окно. Я нашел способ, благодаря этой странице . На самом деле все довольно просто:

var onBeforeUnloadFired = false;

Используйте эту глобальную переменную здесь:

if (!onBeforeUnloadFired) {
    onBeforeUnloadFired = true;
    event.returnValue = "You'll lose changes!";
}
window.setTimeout("ResetOnBeforeUnloadFired()", 1000);

А затем реализовать эту функцию:

function ResetOnBeforeUnloadFired() {
    onBeforeUnloadFired = false;
}

Таким образом, по сути, используйте флаг, но сбросьте его, если пользователь нажмет кнопку «Отмена». Не совсем то, что я хотел бы, но не нашел ничего лучшего.

1 голос
/ 25 ноября 2008

Я не сталкивался с этим, но наверняка вы могли бы установить переменную flag равной результату диалога? Если пользователь отменит флаг, значит, он останется ложным.

var bFlag = window.confirm('Do you want to leave this page?');
0 голосов
/ 18 июня 2009

IE поддерживает событие в объекте документа, называемое onstop. Это событие возникает после события onbeforeunload, но до события onunload. Это не совсем уместно для вашего вопроса о двух диалогах, но все еще актуально для других людей, которые могут наткнуться на эту тему (как я).

Проблема, с которой я столкнулся, заключалась в том, что мне нужно было отобразить сообщение о загрузке при запуске события onbeforeunload. Это все нормально, пока на странице не появится своего рода диалог подтверждения. Событие onbeforeunload срабатывает, даже если пользователь отменил, и остается на странице. Самым простым делом для меня было перенести мою «загрузочную» логику отображения в обработчик для document.onstop. Кроме того, вы должны проверить свойство readyState объекта документа, которое является другим полем только для IE. Если это «загрузка», это означает, что пользователь фактически покидает страницу. Если это "завершено", это означает, что пользователь остается.

Если вас устраивает только использование IE, вас может заинтересовать следующее.

document.onstop = function() 
{
    try
    {
        if( document.readyState != "complete" )
        {
            showLoadingDiv();
        }
    }
    catch( error )
    {
        handleError( error );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...