Может ли JavaScript ответить на запрос пользователя beforeunload? [Дубликат]

A NullReferenceException бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.

Например:

  1. При использовании метода string пустой строки:
    string str = string.Empty;
    str.ToLower(); // throw null reference exception
    
  2. Когда свойство нулевого объекта доступно:
    Public Class Person {
        public string Name { get; set; }
    }
    Person objPerson;
    objPerson.Name  /// throw Null refernce Exception 
    
27
задан at. 10 January 2011 в 20:55
поделиться

5 ответов

Вы можете сделать это следующим образом:

$(function() {
    $(window).bind('beforeunload', function() {
        setTimeout(function() {
            setTimeout(function() {
                $(document.body).css('background-color', 'red');
            }, 1000);
        },1);
        return 'are you sure';
    });
}); 

Код в первом методе setTimeout имеет задержку в 1 мс. Это просто добавить функцию в UI queue. Поскольку setTimeout работает асинхронно, интерпретатор Javascript будет продолжаться, непосредственно вызывая оператор return, который, в свою очередь, запускает браузеры modal dialog. Это заблокирует UI queue, и код из первого setTimeout не будет выполнен, пока модальный не будет закрыт. Если пользователь нажал кнопку «Отмена», он запустит другой setTimeout, который срабатывает примерно через одну секунду. Если пользователь подтвердил с помощью ok, пользователь будет перенаправлен, а второй setTimeout никогда не будет запущен.

пример: http://www.jsfiddle.net/NdyGJ/2/

44
ответ дан jAndy 26 August 2018 в 22:20
поделиться

Я знаю, что этот вопрос старый, но если у кого-то все еще есть проблемы с этим, я нашел решение, которое, похоже, работает для меня,

В основном событие unload запускается после событие beforeunload. Мы можем использовать это, чтобы отменить тайм-аут, созданный в событии beforeunload, изменяя ответ jAndy:

$(function() {
    var beforeUnloadTimeout = 0 ;
    $(window).bind('beforeunload', function()  {
        console.log('beforeunload');
        beforeUnloadTimeout = setTimeout(function() {
            console.log('settimeout function');
            $(document.body).css('background-color', 'red');
        },500);
        return 'are you sure';
    });
    $(window).bind('unload', function() {
        console.log('unload');
        if(typeof beforeUnloadTimeout !=='undefined' && beforeUnloadTimeout != 0)
            clearTimeout(beforeUnloadTimeout);
    });
}); 

EDIT: jsfiddle здесь

4
ответ дан 99 Problems - Syntax ain't one 26 August 2018 в 22:20
поделиться
window.onbeforeunload  = function() {
    if (confirm('Do you want to navigate away from this page?')) {
        alert('Saving work...(OK clicked)')
    } else {
        alert('Saving work...(canceled clicked)')
        return false
    }
 }

с этим кодом, также если пользователь нажмет кнопку «Отмена» в IE8, появится диалоговое окно навигации по умолчанию.

-6
ответ дан Anto 26 August 2018 в 22:20
поделиться

Я не думал, что это возможно, но просто попробовал эту идею, и она работает (хотя некоторые из них относятся к взлому и могут не работать одинаково во всех браузерах):

window.onbeforeunload = function () {   
  $('body').mousemove(checkunload);
  return "Sure thing"; 
};

function checkunload() {   
  $('body').unbind("mousemove");
  //ADD CODE TO RUN IF CANCEL WAS CLICKED
}
2
ответ дан Barlow Tucker 26 August 2018 в 22:20
поделиться

Невозможно. Может быть, кто-то докажет, что я ошибаюсь ... Какой код вы хотите запустить? Вы хотите автоматическое сохранение при нажатии кнопки «Отмена»? Это звучит контр-интуитивно. Если вы еще не автосохранение, я думаю, что нет смысла автоматически сохранять, когда они нажимают «Отмена». Возможно, вы могли бы выделить кнопку сохранения в вашем обработчике onbeforeunload, чтобы пользователь увидел, что им нужно сделать, прежде чем перемещаться.

1
ответ дан Juan Mendes 26 August 2018 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: