2015-06-17 27 views
0

jQuery Validat(e/tion)如何确定一个字段是否正在验证中?

我有一个自定义datepicker小部件,我想验证使用jQuery.validate。当我修改我的日期时,它不会重新验证,可能是因为更改事件不会触发绑定到哪个jQuery.validate的基础隐藏。

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

理论上,这应该可行,但是在jQuery.validation初始化之前,我的小部件的on-change事件触发一次。这似乎完全破坏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> 

回答

-1

但我认为,如果jQuery.validate是否已经被初始化的方法,无论是否存在。

在初始化.validate()之前,不能使用.valid()

但是,因为人们通常会初始化DOM准备好的.validate(),所以这不应该成为问题。

Documentation states:

.validate()需要在表格上使用该方法检查它之前被调用。


所以我在寻找一种方法来确定是否jQuery.validate已经为这个特殊的元素初始化。即确定jQuery.validate是否试图观看它。

简单地初始化DOM上的插件就绪,这样它就可以“观察”触发事件的表单。

$(document).ready(function() { 

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

}); 
+0

“不正确。在.validate()被初始化之前,不能使用.valid()。” - “方法存在”和“可以使用”是两个完全不同的东西。库定义了.valid(),但这并不意味着它可以安全使用。我的观点是,检查存在是不够的。 “简单初始化” - 我不明白这是如何解决我的问题。在**'$('#myform')。validate()'被调用,'.valid()'在该上下文中不起作用之前,我的小部件被初始化为**。这就是问题。 – mpen

+0

@Mark,那么为什么在你初始化依赖'.valid()'的小部件之前,你不能调用'.validate()'***? – Sparky

+0

由于我的表单是如何构建的。小部件在''后立即初始化。我喜欢那样;为什么我要延迟实例化? '.validate()'OTOH只能在''AFAIK之后才能发生。 – mpen

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

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

+0

同样,你甚至需要这样做的原因还不清楚。在初始化依赖于它的小部件之前,为什么不能简单地初始化验证插件还不清楚。在回答关于这个插件的一千个问题时,我从来没有见过任何与你的情况有关的人。这里有些东西很奇怪。 – Sparky

+0

@Sparky我在你的回答下回应了你的评论。我不想推迟我的小部件的初始化。再加上它会是一个重要的重构。我有一些宏写出了所有用于小部件的HTML *和*脚本来初始化它;很难将两者分开。 – mpen

相关问题