Плагин jquery.form/validate разрешает отправку только в том случае, если ввод изменен

Я хотел бы использовать плагины jQuery.Form/Validate, чтобы разрешить отправку моей формы только в том случае, если какие-либо входные данные были фактически изменены.

Для этого существует логика обратного вызова с использованием beforeSubmit: : http://jquery.malsup.com/form/#options-object. Тем не менее, я не могу заставить его работать.

Вот что у меня есть до сих пор:

$(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 показывает "Changed" независимо от того, равно ли storedValue входным данным или нет.


person tim peterson    schedule 11.06.2012    source источник
comment
Я удалил свой комментарий, потому что думал, что вы используете другой плагин. В любом случае мой комментарий действителен для плагина Bassistance Validation (согласно вашему тегу) и может быть действительным для других.   -  person Sparky    schedule 11.06.2012
comment
@ спасибо, я проверю, необходимо ли включать код submitHandler: внутри функции validate({... или нет. В любом случае спасибо за подсказку!   -  person tim peterson    schedule 11.06.2012
comment
Я не обязательно считаю, что вам понадобится submitHandler... это то, что вы не должны заключать .validate() в обработчик. Потому что .validate() инициализирует проверку формы при загрузке страницы. Но когда он находится внутри обработчика, параметры проверки инициализируются только при запуске этого обработчика событий, что приводит к странным и неожиданным результатам.   -  person Sparky    schedule 11.06.2012
comment
@Sparky672, для моего примера необходимо submitHandler:, заключающее validate(). Должен ли я реорганизовать его по-другому?   -  person tim peterson    schedule 11.06.2012
comment
Это нормально, если вам нужно использовать его внутри validate(). Но включение validate() в обработчик приводит к неправильной инициализации проверки. См. здесь, здесь и здесь.   -  person Sparky    schedule 11.06.2012
comment
Да, думайте об этом так же, как и о любом другом плагине jQuery. Как правило, вы просто инициализируете плагин и его параметры в событии ready. Вы редко видите подключаемые модули инициализации jQuery, заключенные в обработчик. Таким же образом относитесь к инициализации плагина .validate(). Вот почему у него есть встроенное событие submitHandler.   -  person Sparky    schedule 11.06.2012
comment
@Sparky672Sparky672 хорошо, теперь я вижу свое замешательство. Как вы фиксируете данные из события клика, если предпочтительнее инициализировать validate() при загрузке страницы, а не внутри функции on() click? Я обернул проверку внутри события клика, потому что часто у меня много форм на странице, и мне нужно собирать данные в зависимости от того, что выбирает пользователь (например, предоставление определенной формы ввода on() click. Мысли?   -  person tim peterson    schedule 11.06.2012
comment
@sparky672 @sparky672, сказал по-другому, как мне передать пользовательские данные из события клика в функцию validate()?   -  person tim peterson    schedule 11.06.2012
comment
запуск проверки и ее инициализация - две разные вещи. Лично я бы инициализировал его на всех формах страниц; затем он запускается только тогда, когда посетитель использует определенную форму.   -  person Sparky    schedule 11.06.2012
comment
Кроме того, сосредоточьтесь на тех трех SO-вопросах/ответах, которые я опубликовал. Существуют различные внешние ссылки на примеры, документацию и т. д., содержащиеся внутри тех, которые должны быть полезными.   -  person Sparky    schedule 11.06.2012
comment
Я думаю, что мой вопрос прост, мне просто нужно передать данные в функцию проверки для использования в обработчике success: и т. д. Есть ли ссылка на это?   -  person tim peterson    schedule 11.06.2012
comment
Я не совсем понимаю, что вы подразумеваете под передачей данных в функцию проверки. Функция validate просматривает форму и ее входные данные всякий раз, когда пользователь нажимает кнопку отправки. Поскольку мне не совсем понятен ваш конкретный вопрос, и это не место для расширенного обсуждения, я призываю вас опубликовать новый вопрос об этом конкретном аспекте.   -  person Sparky    schedule 11.06.2012
comment
@Sparky672 Хорошо, я сделаю это сейчас и сошлюсь на эти вопросы и ответы.   -  person tim peterson    schedule 11.06.2012
comment
Нет ничего плохого в ссылке на этот вопрос, но постарайтесь сделать свой новый вопрос как можно более автономным, чтобы он не требовал просмотра этого вопроса. Также убедитесь, что он достаточно отличается, чтобы не закрыться как дубликат.   -  person Sparky    schedule 11.06.2012
comment
@Sparky672 ок, вот этот новый вопрос, stackoverflow.com/questions/10986523/. Я был бы признателен за ваши мысли, если бы у вас было время. Спасибо,   -  person tim peterson    schedule 11.06.2012


Ответы (1)


Прежде всего, он никогда не будет показывать «Не изменено», так как он returns false до того, как попадет в эту часть. Вы также должны отфильтровать кнопку отправки, так как вы, вероятно, не проверяете ее значение.

$($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 в цикле each(), я увеличивал значение totalChanged и оценивал после цикла each(), было ли оно больше 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
person wirey00    schedule 11.06.2012
comment
-@wirey, спасибо, я думаю, что все еще есть проблема с моим циклом each() в качестве первого значения, title НЕ изменяется, но затем меняются входы description и submit. Вероятно, вы не можете return true/false внутри цикла? мысли? - person tim peterson; 11.06.2012
comment
также странно, что есть еще 3 файла console.log, хотя :submit был отфильтрован. Опять же, цикл each() кажется проблематичным. - person tim peterson; 11.06.2012
comment
@timpeterson тоже это видел. Кажется, он автоматически генерирует скрытое поле со значением submit. Также похоже, что если вы вернете false, он перестанет выполняться, поэтому, если изменится текстовая область, а не заголовок, она никогда не достигнет проверки текстовой области. Вы возвращаете false, чтобы остановить отправку формы? Вот скрипт обновления, который работает так, как вы хотите, я думаю. jsfiddle.net/nELVQ/6 За исключением того, что в этой скрипте нет возврата false - person wirey00; 11.06.2012
comment
-@wirey, круто, спасибо. Это делает это. Последний вопрос, если вы не возражаете. У меня, конечно, есть несколько форм на моей реальной странице, и console.log($(this)) показывает, что эти входные данные, которые не являются частью id=myForm, также оцениваются. Я немного сбит с толку, потому что console.log($($form)) оценивает только id=myForm. Должен быть какой-то способ ограничить этот цикл each(), но я не уверен, мысли? - person tim peterson; 11.06.2012
comment
Значит, он также оценивает элементы из разных форм на странице? Я не слишком уверен, так как $($form+':input'), вероятно, должен фильтровать только элементы из текущей формы, я думаю. В противном случае вы можете выбрать правильную форму путем жесткого кодирования $(#myForm :input).not().each() - person wirey00; 11.06.2012
comment
-@wirey, да, это то, что я сделал (см. ваш обновленный ответ выше), у меня есть много форм, использующих плагин проверки, и я думаю, что $form назначается каждой из них. Спасибо за вашу помощь. Я готов! - person tim peterson; 11.06.2012