A NullReferenceException
бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.
Например:
string str = string.Empty;
str.ToLower(); // throw null reference exception
Public Class Person {
public string Name { get; set; }
}
Person objPerson;
objPerson.Name /// throw Null refernce Exception
Вы можете сделать это следующим образом:
$(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/
Я знаю, что этот вопрос старый, но если у кого-то все еще есть проблемы с этим, я нашел решение, которое, похоже, работает для меня,
В основном событие 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 здесь
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, появится диалоговое окно навигации по умолчанию.
Я не думал, что это возможно, но просто попробовал эту идею, и она работает (хотя некоторые из них относятся к взлому и могут не работать одинаково во всех браузерах):
window.onbeforeunload = function () {
$('body').mousemove(checkunload);
return "Sure thing";
};
function checkunload() {
$('body').unbind("mousemove");
//ADD CODE TO RUN IF CANCEL WAS CLICKED
}
Невозможно. Может быть, кто-то докажет, что я ошибаюсь ... Какой код вы хотите запустить? Вы хотите автоматическое сохранение при нажатии кнопки «Отмена»? Это звучит контр-интуитивно. Если вы еще не автосохранение, я думаю, что нет смысла автоматически сохранять, когда они нажимают «Отмена». Возможно, вы могли бы выделить кнопку сохранения в вашем обработчике onbeforeunload, чтобы пользователь увидел, что им нужно сделать, прежде чем перемещаться.