如何确定某个字段是否正在验证中?

时间:2015-06-17 23:04:35

标签: jquery jquery-validate

jQuery Validat(e/tion)

我有一个自定义的datepicker小部件,我想使用jQuery.validate进行验证。当我修改我的日期时,它不会重新验证,大概是因为更改事件没有触发绑定到jQuery.validate的底层隐藏。

通过我的研究,我发现我可以通过调用$('#mydatepicker').valid()来重新验证单个字段。我可以将它放在我的自定义小部件的on-change处理程序中。

理论上,这应该可行,但是我的小部件的on-change事件在jQuery.validation初始化之前触发一次。这似乎完全打破了jQuery.validate。

所以我正在寻找一种方法来确定是否已为此特定元素初始化了jQuery.validate。即,确定jQuery.validate是否正在尝试观看它。

我试过

if($input.valid) $input.valid();

但我认为无论jQuery.validate是否已初始化,该方法都存在。

要清楚,我的HTML结构如下所示:

<form id="myform">
    <input id="mywidget" type="hidden">
    <script>$('#mywidget').initializeMyCustomWidget();</script>
</form>
<script>
    $('#myform').validate({ myOptions });
</script>

2 个答案:

答案 0 :(得分:1)

我看了.valid方法实际上做了些什么。它运行:

$( this[ 0 ].form ).validate()

即。如果你还没有调用.validate(),那么它将在你的表单中应用一个空的验证器,无论默认规则是什么。这就是为什么它破坏了我的形式。

我能弄清楚如何检查表单是否已经有验证器的唯一方法是检查表单是否具有数据属性validator。我不确定这是多么可靠。

我将这个jQuery扩展写成“可能”验证特定字段。

/**
 * Validate inputs iff the form has a validator.
 */
$.fn.maybeValidate = function() {
    var valid = true;
    this.each(function() {
        if(this.form && $(this.form).data('validator')) {
            valid = $(this).valid() && valid;
        }
    });
    return valid;
}

这对我的用例很有用,因为我可以在我的所有widget onchange回调中调用该方法。如果绑定了验证器,它将重新验证该字段。如果没有,没有伤害。

答案 1 :(得分:-1)

  

但我认为无论jQuery.validate是否已初始化,该方法都存在。

.valid()初始化之前,您无法使用.validate()

但是,由于人们通常会在DOM上初始化.validate(),因此这绝不是问题。

Documentation states:

  在使用此方法检查之前,需要在表单上调用

.validate()

  

所以我正在寻找一种方法来确定是否已为此特定元素初始化了jQuery.validate。即,确定jQuery.validate是否正在尝试观看它。

只需初始化DOM上的插件,就可以“观察”触发事件的表单。

$(document).ready(function() {

    $('#myform').validate({
        // rules, options, etc.
    });

});