Формы Jquery: использование шаблона memento для создания системы уведомлений о грязной форме - существующие шаблоны?
В настоящее время я создаю сценарий, который уведомит пользователя о том, что форма была изменена, прежде чем он уйдет со страницы (кстати, это приложение ASP.NET MVC).
Сначала я создал простой скрипт, который определяет, изменяет ли пользователь какие-либо входные данные, а затем немного переворачивает, чтобы обозначить форму как "Грязная".
Это оказалось слишком простым и не поддерживало расширенные входные данные формы, поэтому я попробовал подключить его дальше.
Лучшее, что я смог найти, это: http://mal.co.nz/code/jquery-dirty-forms/
Этот плагин для грязных форм jquery работает довольно хорошо, но все еще не хватает одной важной функции, которая мне нужна; возможность сравнивать предыдущие значения с тем, что ввел пользователь.
Например, если текстовое поле изначально имеет значение "Foo Bar", а пользователь изменяет это значение на "Foo", форма теперь грязная.
Когда пользователь изменяет значение этого текстового поля обратно на "Foo Bar", то с помощью этого плагина форма все еще "грязная", что неверно в соответствии с моими требованиями.
Нет подключаемого модуля, который делает то, что мне нужно, поэтому мне придется создавать свой собственный, что приводит меня к моему вопросу: каков наилучший способ создания такого рода функциональности?
Моя идея была такая:
- Поскольку это приложение MVC, я мог бы использовать следующую технологию:
- JQuery
- JSON
- аннотации данных
Моя первоначальная мысль такова:
- Страница может иметь много форм; каждая форма будет иметь атрибут "isDirty", изначально установленный в false.
- Мне нужно будет сохранить исходное значение для каждого поля для сравнения (память)
- Каждое поле может иметь класс / флаг / атрибут "isDirty", который будет вызывать это поле "выделять и т. Д."
- Я мог бы хранить эти значения полей в структуре данных JSON NVP
- При отправке JavaScript будет проходить через эту строку JSON и просматривать значения оригинала, сравнивать с текущим значением, если оно недопустимо, тогда он добавит флаг "Грязный" (имя класса добавления) в текстовое поле, которое нарушает грязные правила.,
Производительность и возможность повторного использования являются определенными соображениями. Я должен быть в состоянии применить этот шаблон к любой форме, и без особых усилий позволить ему использовать исходные значения и выполнять проверку.
Кто-нибудь видел существующий шаблон, который похож на мою потребность? Моя идея звучит жизнеспособно? У кого-нибудь есть информация о лучшем маршруте, который я могу выбрать? Начало работы с примером кода, который я мог бы расширить, было бы фантастическим, псевдокод также был бы хорош.
[Обновить]
Кто-то только что сказал мне, что я пытаюсь сделать, это обычно называют "хранилищем форм", хотя Google не очень помогает с этим поисковым термином.
Этот скрипт, с которым я работал, похож на то, что я хочу сделать: (с этой страницы: http://www.mydogboris.com/2009/10/using-jquery-data-feature-to-detect-form-changes/)
var formChanged = false;
$(document).ready(function() {
$('#my_form input[type=text].editable, #my_form textarea.editable').each(function (i) {
$(this).data('initial_value', $(this).val());
});
$('#my_form input[type=text].editable, #my_form textarea.editable').keyup(function() {
if ($(this).val() != $(this).data('initial_value')) {
handleFormChanged();
}
});
$('#my_form .editable').bind('change paste', function() {
handleFormChanged();
});
$('.navigation_link').bind("click", function () {
return confirmNavigation();
});
});
function handleFormChanged() {
$('#save_or_update').attr("disabled", false);
formChanged = true;
}
function confirmNavigation() {
if (formChanged) {
return confirm('Are you sure? Your changes will be lost!');
} else {
return true;
}
}
2 ответа
Я нашел реализацию "хранилища форм", который мне больше нравится с этим плагином: https://github.com/bcswartz/dirtyFields-jQuery-Plugin
Документация доступна на сайте автора здесь: http://www.thoughtdelimited.org/dirtyFields/index.cfm
Разница в том, что плагин dirtyFields ТОЛЬКО обрабатывает грязные поля и формы. Плагин dirtyForms также пытается подключить событие onbeforeunload.
Dirty Forms version 2.0.0 теперь отслеживает состояние полей, когда $('#theform').dirtyForms()
сначала называется. Поля считаются грязными, если они не соответствуют исходному состоянию, и чистыми, если они совпадают.
Это правда, пока вы не позвоните $('#theform').dirtyForms('setClean')
после чего делается новый снимок текущего состояния и любые отклонения от этого нового состояния будут считаться грязными.