Я взял этот скрипт через поиск, используемый для проверки того, были ли изменены поля формы до выхода из страницы:
$(':input').each(function() {
$(this).data('initialValue', $(this).val());
});
window.onbeforeunload = function(){
var msg = 'You haven\'t saved your changes.';
var isDirty = false;
$(':input').each(function () {
if($(this).data('initialValue') != $(this).val()){
isDirty = true;
}
});
if(isDirty == true){
return msg;
}
};
Это работает отлично, когда вы начинаете с пустой формы, но проблема, с которой я сталкиваюсь, заключается в том, что есть возможность заполнить форму существующими данными, считываемыми из базы данных, и первая часть кода срабатывает перед загрузкой данных формы, поэтому функция "onbeforeunload" всегда считает, что форма "грязная",
В идеале я хотел бы приостановить запуск первой части кода до тех пор, пока не будут загружены все данные формы. Я использую ASP/VBScript для загрузки/загрузки базы данных.
благодаря
Поместите код, который устанавливает исходные значения внутри вызываемой функции при загрузке данных:
function setOriginalValues() {
$(':input').each(function() {
$(this).data('initialValue', $(this).val());
});
}
Замечание: вы можете сломать .each()
, вернув false. Это нужно сделать после обнаружения "грязного" значения:
$(':input').each(function () {
if($(this).data('initialValue') != $(this).val()){
isDirty = true;
return false;
}
});
Похоже, данные вашей формы еще не загружены. Даже если он поступает с сервера как часть загрузки страницы, он может быть недоступен до тех пор, пока эта страница страницы не будет проанализирована браузером, который, предположительно, после вашего кода.
Если вы заполняете Ajax, вы должны запустить свою функцию в обратном вызове, как предложили другие. Однако, если нет, вы можете просто поместить код в обработчик, который ждет, пока страница не будет готова.