#javascript #jquery
#javascript #jquery ( jquery )
Вопрос:
Я работаю в наследии ASP.NET/MVC проект, который использует немного jQuery для предоставления предупреждения о несохраненных изменениях. Там есть utils.js файл, который включен на каждую страницу, содержащую:
// Has the user made changes on the form?
var formHasModifications = false;
$(document).ready(function () {
// We want to trigger the unchanged dialog, if the user has changed any fields and hasn't saved
$(window).bind('beforeunload', function () {
if (formHasModifications) {
return "You haven't saved your changes.";
}
});
// If a field changes, the user has made changes
$("form:not(.noprompt)").change(function (event) {
formHasModifications = true;
});
// If the form submits, the changes are saved
$("form:not(.noprompt)").submit(function (event) {
formHasModifications = false;
});
// $(document).ready() may make changes to fields, so we need to clear the flag
// immediately after it returns
setTimeout(function() {
formHasModifications = false;
}, 1);
});
В чем проблема? Событие .submit() срабатывает и перехватывается при каждой отправке, в том числе при отправках, которые фактически не отправляют данные.
То есть, если возникает ошибка проверки, нажатие на кнопку отправки оставляет пользователя на странице с несохраненными изменениями и отображаемыми сообщениями об ошибке проверки, но при этом также снимается флаг formHasModifications.
В результате, если пользователь вносит изменения в один или несколько входных данных, нажимает «отправить», получает ошибки проверки, затем переходит на другую страницу без их исправления и повторной отправки, он не видит диалог несохраненных изменений, даже если у него есть несохраненные изменения.
Это, как я уже сказал, устаревшее приложение, и я не заинтересован в фундаментальных структурных изменениях. Но если есть какой-то способ определить в jQuery, было ли событие отправки успешным или неудачным, я бы очень хотел знать.
Комментарии:
1. Что вы используете для проверки? Плагин jQuery (например, jQuery validate) или встроенные функции проверки браузера?
2. Мы используем jquery.validate.
3. Спасибо — вы заставили меня искать в нужном месте…
Ответ №1:
Хорошо, как указал Терри, это зависит от того, что мы используем для проверки.
В нашем случае мы используем jquery.validate. И с помощью этого мы можем вызвать .valid() в форме, чтобы определить, прошла ли форма проверку:
// If the form successfully submits, the changes are saved
$("form:not(.noprompt)").submit(function (event) {
if ($(this).valid()) {
formHasModifications = false;
}
});