javascript - Jquery 表单 : using the memento pattern to build a dirty form notification system - exisitng patterns?

标签 javascript jquery dirty-data memento jquery-dirtyforms

我目前正在构建一个脚本,该脚本将在用户离开页面之前通知用户表单已更改(顺便说一句,这是一个 ASP.NET MVC 应用程序)。

我首先开始构建一个简单的脚本,用于检测用户是否更改了任何输入,然后稍微翻转一下以将表单指定为“脏”。

这最终太简单了,并且缺乏对扩展表单输入的支持,所以我接下来尝试了一个插件。

我能找到的最好的一个是:http://mal.co.nz/code/jquery-dirty-forms/

这个 jquery dirty forms 插件工作得很好,但仍然缺少我需要的一个重要功能;能够将以前的值与用户输入的值进行比较。

例如,如果文本字段最初的值为“Foo Bar”,而用户将该值更改为“Foo”,则表单现在是脏的。

当用户将该文本框的值更改回“Foo Bar”时,然后使用此插件,表单仍然是“脏”,这根据我的要求是不正确的。

没有插件可以完成我需要的功能,因此我必须构建自己的插件,这引出了我的问题:构建此类功能的最佳实践是什么?

我的想法是这样的:

  • 由于这个应用程序是 MVC,我可以使用以下技术:
    • jquery
    • json
    • 数据注释

我最初的想法是:

  • 页面可以有多种形式;每个表单都有一个属性“isDirty”,最初设置为 false。
  • 我需要存储每个字段的原始值以进行比较(备忘录)
  • 每个字段都可以有一个类/标志/属性“isDirty”,它将调用该字段“突出显示等”
  • 我可以将这些字段值存储在 JSON NVP 数据结构中
  • 提交时,JavaScript 将遍历该 JSON 字符串并查看原始值,与当前值进行比较,如果无效,则会向文本字段添加“脏”标志(附加类名),这违反了规定肮脏的规则。

性能和可重用性是明确的考虑因素。我应该能够将此模式应用于任何形式,并且只需很少的工作就可以让它使用原始值并执行验证。

有人见过与我的需求类似的现有模式吗?我的想法听起来可行吗?有人对我可以采取的更好路线提出意见吗?让我开始使用可以扩展的代码示例会很棒,伪代码也很好。

[更新]

有人刚刚告诉我,我想做的事情通常被称为“表单存储”,尽管谷歌对这个搜索词没有多大帮助。

我一直在使用的这个脚本与我想要做的类似: (从此页面: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;
    }
  }

最佳答案

我发现了一个我更喜欢这个插件的“表单存储”的实现:https://github.com/bcswartz/dirtyFields-jQuery-Plugin

文档可在作者的网站上找到:http://www.thoughtdelimited.org/dirtyFields/index.cfm

区别在于 dirtyFields 插件仅处理脏字段和表单。 dirtyForms 插件还尝试连接 onbeforeunload 事件。

关于javascript - Jquery 表单 : using the memento pattern to build a dirty form notification system - exisitng patterns?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10557502/

相关文章:

javascript - 如何回到 AngularJS 中对象的脏状态之前

ruby-on-rails - Rails 不保存已更改的属性

memory - 页表条目中的 x86 脏位

javascript - 减少 AJAX 请求大小。与投票系统的简单聊天

javascript - 检查客户端浏览器是否支持并启用 WebGL2

javascript - 具有相同类的按钮在使用 JQuery Click 功能时出现问题

jquery - 从 Advanced News Ticker 中删除右边框

javascript - 删除几个节点后的 D3 SVG 过渡问题

javascript - 如何使用 parseFloat 使用对象属性按降序排序?

javascript - 下载 HTML 表 colspan 和 rowspan 没有拾取