【问题标题】:Add submitHandler to jQuery validate() at run time在运行时将 submitHandler 添加到 jQuery validate()
【发布时间】:2015-01-22 03:15:25
【问题描述】:

我正在使用jQuery mt-select 管理从数千种可能性列表中自动完成的选择。

表单使用文本输入初始化,如

<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">

我希望这些表单在 validate() 在主 JavaScript 文件中初始化之后添加一个 jQuery validate submitHandler。这将检查以确保已做出至少一项所需的选择。

当存在(或不)时,我已经验证了$("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" }
        }                      
    });

【问题讨论】:

  • 两个问题。下面由@charlietfl 描述的一个......您不能多次初始化插件。第二个是您不应该在submitHandler 内部进行任何验证。根据定义,此处理程序仅在按钮单击时触发当表单有效时;从那里发送“无效表单”消息绝对没有意义......还有很多其他机会可以确保表单在调用submitHandler之前完全有效。

标签: jquery forms jquery-validate


【解决方案1】:

两个初始化实例不会组合彼此的选项,第二个会覆盖第一个。

您可以做的是将选项分解为存储的对象变量,并根据表单类(如果该类存在)对其进行扩展。

类似:

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);

【讨论】:

  • 实际上,first 实例将优先于任何其他实例。使用.validate() 方法,所有后续调用都将被忽略。
  • @sparky,不知道,我猜它会检查data()?无论如何,甚至很难分辨 OP 中哪个是第一个或最后一个......我认为只扩展和初始化一次仍然是最明智的
  • 从来没有检查过核心的原因,但根据经验,它总是只有第一个实例才重要。是的,你的回答似乎是正确的。
  • 虽然,OP 不应该在 submitHandler 内做更多的验证。根据定义,此处理程序仅在按钮单击时触发当表单有效时;当有很多其他机会可以确保表单在 之前 submitHandler 是调用。
  • @jerrygarciuh,只要将ignore 选项设置为[],就可以验证任何隐藏字段。只需在locationID 上设置required 规则,与任何其他字段没有什么不同。如果该字段不存在,则规则将被忽略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多