通过javascript跟踪表单中的更改的最佳方法是什么?

Ric*_*ras 47 javascript forms

我想通过javascript跟踪表单中输入的变化.我的意图是(但不限于)

  • 只有在某些内容发生变化时才启用"保存"按钮
  • 如果用户想要关闭页面并且未保存某些内容则发出警报

想法?

nic*_*ckf 31

循环遍历所有输入元素,并onchange在每个元素上放置一个处理程序.当它触发时,设置一个标志,让您知道表单已更改.它的基本版本很容易设置,但是如果有人将输入从"a"更改为"b"然后再返回"a",则不足以识别.如果抓住那个案件很重要,那么它仍然是可能的,但需要更多的工作.

这是jQuery中的一个基本示例:

$("#myForm")
    .on("input", function() {
        // do whatever you need to do when something's changed.
        // perhaps set up an onExit function on the window
        $('#saveButton').show();
    })
;
Run Code Online (Sandbox Code Playgroud)

  • 您可以在循环中使用闭包来存储输入字段的值,然后您可以测试输入是否更改回值.你必须为单选按钮,复选框和提交按钮做一些特殊情况.哦,不要忘记在这种情况下删除unbink! (3认同)
  • @nickf这是表单中最后一个字段的问题.用户将填写该字段,并想知道为什么提交按钮仍然看起来已禁用:(不明显他们必须单击某处 - 或 - 选项卡才能继续,直到他们实际点击 - 某处 - 或 - 选项卡.糟糕的UX设计. (3认同)
  • TextArea 和其他类型的输入字段呢? (2认同)
  • 您可以使用`input`事件,与8年前相比,它具有更好的浏览器支持.https://developer.mozilla.org/en-US/docs/Web/Events/input触发对字段的每次更改,包括键入,删除,粘贴等. (2认同)

Dyl*_*tie 17

JS中的文本表单元素公开了.value属性和.defaultValue属性,因此您可以轻松实现以下内容:

function formChanged(form) {
  for (var i = 0; i < form.elements.length; i++) {
      if(form.elements[i].value != form.elements[i].defaultValue) return(true);
  }
  return(false);
}
Run Code Online (Sandbox Code Playgroud)

对于复选框和单选按钮,查看是否element.checked != element.defaultChecked,以及对于HTML <select />元素,您需要循环遍历select.options数组并检查每个选项是否selected == defaultSelected.

您可能希望使用类似jQuery的框架来将处理程序附加到onchange每个单独表单元素的事件.这些处理程序可以调用您的formChanged()代码并修改enabled"保存"按钮的属性,和/或附加/分离文档正文beforeunload事件的事件处理程序.


小智 7

尝试

function isModifiedForm(form){
  var __clone = $(form).clone();
  __clone[0].reset();
  return $(form).serialize() == $(__clone).serialize();
}
Run Code Online (Sandbox Code Playgroud)

希望它的帮助))


ski*_*ulk 6

这是一个简单的用于检测表单更改的 javascript 和 jquery 方法。它禁用提交按钮,直到进行更改。它检测通过提交表单以外的方式离开页面的尝试。它解释了用户的“撤消”,它被封装在一个函数中以便于应用,并且它不会在提交时失火。只需调用该函数并传递表单的 ID。

此函数在页面加载时序列化表单一次,并在用户离开页面之前再次序列化。如果两个表单状态不同,则会显示提示。

试试看:http : //jsfiddle.net/skibulk/ev5rE/

function formUnloadPrompt(formSelector) {
    var formA = $(formSelector).serialize(), formB, formSubmit = false;

    // Detect Form Submit
    $(formSelector).submit( function(){
        formSubmit = true;
    });

    // Handle Form Unload    
    window.onbeforeunload = function(){
        if (formSubmit) return;
        formB = $(formSelector).serialize();
        if (formA != formB) return "Your changes have not been saved.";
    };

    // Enable & Disable Submit Button
    var formToggleSubmit = function(){
        formB = $(formSelector).serialize();
        $(formSelector+' [type="submit"]').attr( "disabled", formA == formB);
    };

    formToggleSubmit();
    $(formSelector).change(formToggleSubmit);
    $(formSelector).keyup(formToggleSubmit);
}



// Call function on DOM Ready:

$(function(){
    formUnloadPrompt('form');
});
Run Code Online (Sandbox Code Playgroud)