2015-01-22 5 views
1

Я использую jQuery mt-select для управления автоматически заполненными выборами из списка тысяч возможностей.Добавить submitHandler в jQuery validate() во время выполнения

форма инициализирует с ввода текста, как

<input type="text" class="form-control" id="location[]" data-mt-filter-control="" autocomplete="on" style="width: auto;"> 

Затем по мере добавления выбора скрытые входы добавляются как

<input type="hidden" name="locationID[1]" value="1786" data-tag-id="1786"> 

Я хочу, чтобы эти формы добавить JQuery проверки submitHandler после Validate () инициализирован в основном файле JavaScript. Это проверит, чтобы убедиться, что был сделан хотя бы один из необходимых вариантов выбора.

Если существует выбор (или нет), я подтвердил, что $("input[name^='locationID']").length дает ожидаемые значения. Однако форма верна, независимо от того, существуют ли они или нет, заставляет меня полагать, что submitHandler не добавляется.

В консоли нет ошибок или предупреждений, и validate() ведет себя иначе, как ожидалось, когда класс required применяется к не скрытым полям.

Так почему же submitHandler не стреляет?

На странице этой формы у меня есть:

<script type="text/javascript"> 
$(document).ready(function(){ 
    $("form").validate({ 
     submitHandler: function(form) { 
      if($("input[name^='locationID']").length > 0) { 
       //Form is valid 
       alert('form data valid'); 
       form.submit(); 
      } 
      else { 
       //Form is invalid 
       alert('form data invalid'); 
      } 
     }, 
     errorPlacement: function(error, element){ 
      if(element.attr("name") == "locationID[]"){ 
       error.appendTo($('#errorbox')); 
       console.log('saw error'); 
      }else{ 
       error.appendTo(element.parent().next()); 
       console.log('other errors'); 
      } 
     } 
    }); 
}); 
</script> 

И в главном файле JS для всех страниц инициализирую Validate() как так:

$("form").validate({ 
     ignore: [], // include hidden fields 
     errorPlacement: function(error, element) { 
      if (element.is(":radio")) { 
       error.appendTo ('#' + element.attr('name') + '_multiError'); // eg rad_22_multiError 
      } else if (element.is(":checkbox")) { 
       error.appendTo ('#' + element.attr('name').replace(/[\[\]]+/g,'') + '_multiError'); 
      } else { 
       error.appendTo(element.parent()); 
      } 
     }, 
     rules: { 
      antispam: { equalToParam: "events" } 
     }      
    }); 
+1

два вопроса. Один из описанных ниже @charlietfl ниже ... вы не можете инициализировать плагин несколько раз. Во-вторых, вы не должны делать больше проверки внутри 'submitHandler'. По определению этот обработчик запускается только при нажатии кнопки _, когда форма действительна; совершенно не имеет смысла посылать сообщение «недействительной формы» ... существует множество других возможностей для того, чтобы форма была полностью действительной долгое время перед вызовом 'submitHandler'. – Sparky

ответ

3

Два экземпляра инициализации не будет объединить варианты друг друга, второй - перезаписать первый.

Что вы можете сделать, это разбить параметры на хранимую переменную объекта и расширить их на основе класса формы, если этот класс существует.

Что-то вроде:

var validateOpts = { 
    ignore: [], 
    errorPlacement: function (error, element) {...}, 
    rules: {...} 
} 

var extraOpts ={ 
    submitHandler:function(){...} 
    errorPlacement: function(error, element){...} 
} 

var $form =$('form'); 
/* see if we need to combine the options or not */ 
if($form.is('.specialFormClass')){ 
    /* yup...needs extending */ 
    $.extend(validateOpts, extraOpts); 
} 
/* now init the validation */ 
$form.validate(validateOpts); 
+1

Фактически, экземпляр _first_ будет иметь приоритет над любыми другими. С помощью метода '.validate()' все последующие вызовы игнорируются. – Sparky

+1

@sparky, не знал этого, я думаю, он проверяет 'data()'? В любом случае трудно даже сказать, что было первым или последним в OP ... Расширение и инициализация только один раз по-прежнему наиболее разумны. Я думаю, – charlietfl

+1

Никогда не исследовал ядро ​​по этой причине, но из опыта это всегда имеет значение только в первом случае. Да, ваш ответ кажется звуковым. – Sparky

Смежные вопросы