Javascript jquery.form/validate插件仅允许在输入更改时提交

Javascript jquery.form/validate插件仅允许在输入更改时提交,javascript,jquery,jquery-validate,jquery-forms-plugin,Javascript,Jquery,Jquery Validate,Jquery Forms Plugin,我想使用jQuery.Form/Validate插件,仅在任何输入被实际更改时才允许提交我的表单 使用beforeSubmit::,对此有回调逻辑。然而,我似乎无法让它工作 以下是我目前掌握的情况: $(document.body).on('click', 'input[type="submit"]', function(){ var $form =$('form'); $form.validate({ submitHandler: function($form) { $($for

我想使用jQuery.Form/Validate插件,仅在任何输入被实际更改时才允许提交我的表单

使用beforeSubmit::,对此有回调逻辑。然而,我似乎无法让它工作

以下是我目前掌握的情况:

$(document.body).on('click', 'input[type="submit"]', function(){
 var $form =$('form');

$form.validate({
  submitHandler: function($form) {
   $($form).ajaxSubmit({
  beforeSubmit: function(arr, $form){           
      var value = '', storedValue='';
      $($form+':input').each(function (index, el) {
  value=$(el).val();
  storedValue=$(el).data("stored");            
      if(value!=storedValue){
      console.log("Changed");   return true;
  } 
      else {
      return false; console.log("NOT changed");
  }
});   

...success handling, etc..

beforeSubmit: function(arr, $form) { 
  var value = '', storedValue='';
  $($form+':input').each(function (index, this) {
    value=this.value;
    storedValue=$(this).data("stored");            
        if(value!=storedValue){
          console.log("Changed");return true;
        } 
        else {
         return false; console.log("NOT changed");
        }
  });                   
}
以下是HTML:

<form id="myForm">
  <input data-stored="my title" value="my title"/>
  <textarea data-stored="my description">my description</textarea>
  <input type="submit" value="submit/>
</form>

当前,console.log显示已更改,无论storedValue是否等于输入。

首先,它永远不会显示未更改,因为它在命中该部分之前返回false。您也应该过滤掉submit按钮,因为您可能没有检查它的值

$($form+':input').not(':submit').each(function(index, this) {
    value = this.value;
    storedValue = $(this).data("stored");
    if (value != storedValue) {
        console.log("Changed");
        return true;      
    }
    else {       
        console.log("NOT changed");
        return false;
    }
});
更新 在@wirey的大力协助下,@timrpeterson和@wirey共同制定了一个解决方案。我没有在每个循环中返回true/false,而是增加了一个值totalChanged,并在每个循环之后评估它是否大于0

代码如下:

beforeSubmit: function(arr, $form){   
var value = '', storedValue='', totalChanged=0;
$('#myForm :input').not(':submit,:hidden').each(function (i, el) {
  //console.log($(this));
    console.log($($form));
    value=$(el).val(); 
    storedValue=$(el).data("stored");          
    if (value != storedValue) {  
      totalChanged++;    
    }
    else {     
    }
}); //each

  if(totalChanged>0){
     console.log("at least one changed");
     return true;
  }
  else{
     console.log("All NOT changed");
     return false;
  }
} //beforeSubmit

-@wirey,谢谢,我认为我的每个循环作为第一个值仍然存在问题,标题没有改变,但是描述和提交输入都改变了。您可能无法在循环中返回true/false?想法?尽管:submit被过滤掉了,但仍然有3个console.log,这也很奇怪。同样,每个循环似乎都有问题。@Timperson也看到了这一点。它似乎也会自动生成一个值为submit的隐藏字段。此外,如果返回false,它将停止执行,因此如果textarea更改而不是标题,它将永远不会到达textarea验证。您是否返回false以阻止表单提交?这是一个更新的小提琴,它的工作就像你想要的,我想。除了这把小提琴外,别无归路,假-@wirey,太棒了,谢谢。就是这样。最后一个问题,如果你不介意的话。当然,我的真实页面和控制台上有多个表单。我有点困惑,因为console.log$$form只计算id=myForm。必须有某种方法来限制每个循环,但我不确定,想法?所以它也在评估页面上不同形式的元素?我不太确定,因为$$form+“:input”应该只过滤当前表单中的元素。否则,您可以通过硬编码$myForm:input.not来选择正确的表单。eachI删除了我的评论,因为我认为您使用的是不同的插件。在任何一种情况下,根据您的标记,我的注释对有效,并且可能对其他人有效。@谢谢,我将检查是否在验证中包含submitHandler:代码{…函数是必要的还是不必要的。不管怎样,谢谢你的提示!我的观点不一定是你需要submitHandler…而是你不应该将.validate包含在处理程序中。因为.validate在页面加载时初始化表单验证。但是当它在处理程序中时,验证选项只有在这样的情况下才会初始化t处理程序被激发,这会导致奇怪和意外的结果。@Sparky672,submitHandler:在我的示例中,封闭验证是必要的。我是否应该以另一种方式重构它?如果需要在验证内部使用它,这很好。但是在处理程序中封闭验证会导致验证初始化不正确。请参阅,和。