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

时间:2010-06-11 18:49:01

标签: javascript jquery

在jQuery中,有没有一种简单的方法可以测试表单的元素是否已经改变了?

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

编辑:抱歉,我真的应该更具体一点!假设我有一个表单,并且我有一个包含以下内容的按钮:

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

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

13 个答案:

答案 0 :(得分:128)

你可以这样做:

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

这会为表单中的输入设置一个change事件处理程序,如果其中任何一个更改,则使用.data()changed值设置为true,然后我们只是检查点击上的该值,这假设#mybutton位于表单内(如果不只是将$(this).closest('form')替换为$('#myForm')),但您可以使其更通用,如下所示:

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

参考文献:已更新

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

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

  

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

答案 1 :(得分:45)

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

$(function() {

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

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

});

答案 2 :(得分:17)

实时且简单的解决方案:

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

答案 3 :(得分:10)

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

$("input, select").change(function(){
    // Something changed
});

修改

由于您提到您只需点击一下即可,您只需将原始代码修改为:

$("input, select").click(function(){
    // A form element was clicked
});

编辑#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;
});

答案 4 :(得分:3)

查看更新后的问题,请尝试

$('input, textarea, select').each(function(){
    $(this).data("val", $(this).val());
});
$('#button').click(function() {
    $('input, textarea, select').each(function(){
        if($(this).data("val")!==$(this).val()) alert("Things Changed");
    });
});

对于原始问题,请使用

之类的内容
$('input').change(function() {
    alert("Things have changed!");
});

答案 5 :(得分:2)

$('form :input').change(function() {
    // Something has changed
});

答案 6 :(得分:2)

这是一个优雅的解决方案。

表单上的每个输入元素都有隐藏属性,可用于确定值是否已更改。 每种类型的输入都有自己的属性名称。例如

  • text/textarea defaultValue
  • 表示select defaultSelect
  • checkbox/radio defaultChecked

以下是示例。

function bindFormChange($form) {

  function touchButtons() {
    var
      changed_objects = [],
      $observable_buttons = $form.find('input[type="submit"], button[type="submit"], button[data-object="reset-form"]');

    changed_objects = $('input:text, input:checkbox, input:radio, textarea, select', $form).map(function () {
      var
        $input = $(this),
        changed = false;

      if ($input.is('input:text') || $input.is('textarea') ) {
        changed = (($input).prop('defaultValue') != $input.val());
      }
      if (!changed && $input.is('select') ) {
        changed = !$('option:selected', $input).prop('defaultSelected');
      }
      if (!changed && $input.is('input:checkbox') || $input.is('input:radio') ) {
        changed = (($input).prop('defaultChecked') != $input.is(':checked'));
      }
      if (changed) {
        return $input.attr('id');
      }

    }).toArray();

    if (changed_objects.length) {
      $observable_buttons.removeAttr('disabled')   
    } else {
      $observable_buttons.attr('disabled', 'disabled');
    }
  };
  touchButtons();

  $('input, textarea, select', $form).each(function () {
    var $input = $(this);

    $input.on('keyup change', function () {
      touchButtons();
    });
  });

};

现在只需循环浏览页面上的表单,您应该会看到默认情况下禁用提交按钮,只有在您确实更改表单上的某些输入值时才会激活它们。

$('form').each(function () {
    bindFormChange($(this));
});

作为jQuery插件的实现在https://github.com/kulbida/jmodifiable

答案 7 :(得分:2)

var formStr = JSON.stringify($("#form").serializeArray());
...
function Submit(){
   var newformStr = JSON.stringify($("#form").serializeArray());
   if (formStr != newformStr){
      ...
         formChangedfunct();
      ...
   }
   else {
      ...
         formUnchangedfunct();
      ...
   }
}

答案 8 :(得分:1)

您需要 jQuery Form Observe 插件。这就是你要找的东西。

答案 9 :(得分:1)

扩展Udi的答案,这只会检查表单提交,而不是每次输入更改。

$(document).ready( function () {
  var form_data = $('#myform').serialize();
  $('#myform').submit(function () {
      if ( form_data == $(this).serialize() ) {
        alert('no change');
      } else {
        alert('change');
      }
   });
});

答案 10 :(得分:0)

首先,我会在表单中添加一个隐藏的输入来跟踪表单的状态。然后,当表单上的某些内容发生变化时,我将使用此jQuery代码段设置隐藏输入的值:

    $("form")
    .find("input")
    .change(function(){
        if ($("#hdnFormChanged").val() == "no")
        {
            $("#hdnFormChanged").val("yes");
        }
    });

单击按钮后,您可以检查隐藏输入的状态:

$("#Button").click(function(){
    if($("#hdnFormChanged").val() == "yes")
    {
        // handler code here...
    }
});

答案 11 :(得分:0)



$('form[name="your_form_name"] input, form[name="your_form_name"] select').click(function() {
  $("#result").html($(this).val());
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h2>Form "your_form_name"</h2>
<form name="your_form_name">
  <input type="text" name="one_a" id="one_a" value="AAAAAAAA" />
  <input type="text" name="one_b" id="one_b" value="BBBBBBBB" />
  <input type="text" name="one_c" id="one_c" value="CCCCCCCC" />
  <select name="one_d">
    <option value="111111">111111</option>
    <option value="222222">222222</option>
    <option value="333333">333333</option>
  </select>
</form>
<hr/>
<h2>Form "your_other_form_name"</h2>
<form name="your_other_form_name">
  <input type="text" name="two_a" id="two_a" value="DDDDDDDD" />
  <input type="text" name="two_b" id="two_b" value="EEEEEEEE" />
  <input type="text" name="two_c" id="two_c" value="FFFFFFFF" />
  <input type="text" name="two_d" id="two_d" value="GGGGGGGG" />
  <input type="text" name="two_e" id="two_f" value="HHHHHHHH" />
  <input type="text" name="two_f" id="two_e" value="IIIIIIII" />
  <select name="two_g">
    <option value="444444">444444</option>
    <option value="555555">555555</option>
    <option value="666666">666666</option>
  </select>
</form>
<h2>Result</h2>
<div id="result">
  <h2>Click on a field..</h2>
</div>
&#13;
&#13;
&#13;

除了@ JoeD的答案之外。

如果您想要以特定形式(假设有多个表单)而不仅仅是字段来定位字段,您可以使用以下代码:

$('form[name="your_form_name"] input, form[name="your_form_name"] select').click(function() {
    // A form element was clicked
});

答案 12 :(得分:0)

尝试一下:

<script>
var form_original_data = $("form").serialize(); 
var form_submit=false;
$('[type="submit"]').click(function() {
    form_submit=true;
});
window.onbeforeunload = function() {
    //console.log($("form").submit());
    if ($("form").serialize() != form_original_data && form_submit==false) {
        return "Do you really want to leave without saving?";
    }
};
</script>