你如何处理jQuery中的表单更改?

mik*_*ike 77 javascript jquery

在jQuery中,是否有一种简单的方法可以测试表单元素的任何变化?

编辑:我应该补充一点,我只需要检查一个click()事件.

编辑:对不起我真的应该更具体!假设我有一个表单,我有一个按钮,其中包含以下内容:

$('#mybutton').click(function() {
  // Here is where is need to test
  if(/* FORM has changed */) {
     // Do something
  }
});
Run Code Online (Sandbox Code Playgroud)

我如何测试表单自加载后是否已更改?

Nic*_*ver 132

你可以这样做:

$("form :input").change(function() {
  $(this).closest('form').data('changed', true);
});
$('#mybutton').click(function() {
  if($(this).closest('form').data('changed')) {
     //do something
  }
});
Run Code Online (Sandbox Code Playgroud)

该钻机一个change事件处理程序的形式输入,如果其中任何变更使用.data()设定changedtrue,那么我们就检查在点击该值,这个假设#mybutton的形式里(如果不只是更换$(this).closest('form')$('#myForm'))但你可以使它更通用,像这样:

$('.checkChangedbutton').click(function() {
  if($(this).closest('form').data('changed')) {
     //do something
  }
});
Run Code Online (Sandbox Code Playgroud)

参考文献:更新

根据jQuery,这是一个选择所有表单控件的过滤器.

http://api.jquery.com/input-selector/

:输入选择器基本上选择所有表单控件.

  • @Val它占所有3个,请看这里:http://api.jquery.com/input-selector/ (8认同)
  • `$('form:input')`是否为select,textarea和其他输入类型?或者它是否特定于输入标签? (6认同)
  • 如果我错了,请纠正我,但看起来,这种方法会说表格已经改变,即使有人做出改变然后"撤消"他们的改变,手动恢复到表格中的原始值.在这种情况下,表单确实不会改变数据,但这种方法会说它有. (6认同)

Udi*_*Udi 46

如果要检查表单数据(将要发送到服务器)是否已更改,可以在页面加载时序列化表单数据并将其与当前表单数据进行比较:

$(function() {

    var form_original_data = $("#myform").serialize(); 

    $("#mybutton").click(function() {
        if ($("#myform").serialize() != form_original_data) {
            // Something changed
        }
    });

});
Run Code Online (Sandbox Code Playgroud)

  • 很好,这是这里最好的解决方案.谢谢. (5认同)
  • 我曾经使用过这种方法,当形状变大时变得非常慢.对于小型表单来说,这是一种很好的方法,但它不适合大型表单. (3认同)
  • 这样做要好得多,所以你可以触发按钮返回禁用状态,比如"删除" (2认同)

Mar*_*ato 20

一个实时而简单的解决方案:

$('form').on('keyup change paste', 'input, select, textarea', function(){
    console.log('Form changed!');
});
Run Code Online (Sandbox Code Playgroud)

  • 除非你需要支持旧的浏览器,否则考虑使用''input'而不是''keyup change'来处理鼠标右键. (2认同)

Joe*_*e D 10

您可以使用多个选择器将回调附加到任何表单元素的change事件.

$("input, select").change(function(){
    // Something changed
});
Run Code Online (Sandbox Code Playgroud)

编辑

既然你提到你只需要点击一下,你可以简单地修改我的原始代码:

$("input, select").click(function(){
    // A form element was clicked
});
Run Code Online (Sandbox Code Playgroud)

编辑#2

好的,你可以设置一个像这样改变后设置的全局:

var FORM_HAS_CHANGED = false;

$('#mybutton').click(function() {
    if (FORM_HAS_CHANGED) {
        // The form has changed
    }
});

$("input, select").change(function(){
    FORM_HAS_CHANGED = true;
});
Run Code Online (Sandbox Code Playgroud)