我怎样才能添加,删除或交换页面的jQueryvalidation规则?

注意:
这个问题是指jQuery.validate() (版本1.5)的一个非常旧的版本。 这个插件现在提供了一个内置的解决scheme:应该使用.rules()方法 。 对于需要维护无法升级到最新版本的jQuery和jQuery.validate()的遗留网站的用户,我将以原始forms留下这个问题和答案,以用于历史目的。


我有一个表单来切换什么input元素是可见的。 我只想validation窗体上的可见元素。

我很难得到这个function正常。 我想禁用不可见元素的validation器,我似乎无法找出最好的方法来做到这一点。 任何洞察到什么可能是错误的我的代码,或我的方法,将不胜感激。

当能见度切换时,我尝试了几件事情:

  • 调用$("form").rules("remove")来清除所有现有的validation规则。 这会抛出一个“未定义的”JavaScriptexception。
  • 为可见元素调用$("form").validation(...options...) ,希望这会覆盖规则。 这只允许validation的第一组工作。 第二个面板不能被validation。
  • 在调用新的validation()方法之前解绑定提交处理程序。 这没有做我会想到的。 它永久删除所有validation(表面上),表单提交没有validation。
  • 在尝试再次调用validation器之前用$.removeData($('form'), 'validator')清除validation对象。 这也是行不通的。
  • 这是在ASP.NET网站,所以使用多个<form />标签是不可能的,因为这将打破页面。

我有点沉迷于如何做这项工作。 您可以在http://jsbin.com/ucibe3看到完整的工作演示,或者在http://jsbin.com/ucibe3/edit编辑。 我试图把它解决只是导致错误的代码。

这里是我的代码的关键部分(使用上面的链接完整的工作页面)

HTML:

 <td id="leftform"> Left Form<br /> Input 1: <input type="text" name="leftform_input1" /><br /> Input 2: <input type="text" name="leftform_input2" /><br /> <input type="submit" name="leftform_submit" value="Submit Left" /> </td> <td id="rightform" style="visibility:hidden"> Right Form<br /> Input 1: <input type="text" name="rightform_input1" /><br /> Input 2: <input type="text" name="rightform_input2" /><br /> <input type="submit" name="rightform_submit" value="Submit Right" /> </td> 

JavaScript的:

 $('#toggleSwitch').click(function() { if ($('#leftform').css("visibility") !== "hidden") { $('#leftform').css("visibility", "hidden"); $('#rightform').css("visibility", "visible"); $('form').validate({ rules: { rightform_input1: { required: true }, rightform_input2: { required: true } }, messages: { rightform_input1: "Field is required", rightform_input2: "Field is required" } }); } else { $('#rightform').css("visibility", "hidden"); $('#leftform').css("visibility", "visible"); $('form').validate({ rules: { leftform_input1: { required: true }, leftform_input2: { required: true } }, messages: { leftform_input1: "Field is required", leftform_input2: "Field is required" } }); } }); 

过时的通知:
这个答案是指jQuery.validate()插件(版本1.5)的一个非常旧的版本,现在已经过时,因为插件提供了一个官方的API来解决这个问题。 有关解决此问题的当前方法,请参阅.rules()文档 。 我离开这个答案是为了帮助那些必须维护一个遗留网站,无法升级到最新版本的jQuery和jQuery.validate()的人。


这使用了API中没有很好logging的validation器的function(我的意思是它没有logging),但是由于它是validation器工作的基本部分,所以它不可能被删除即使它是无证的。

一旦你初始化了jQueryvalidation器,你可以通过调用你应用validation器的表单对象上的validate()方法来再次访问validation器对象。 这个validation器对象有一个settings属性,它存储了默认设置,以及你在初始化时应用的设置。

假设我像这样初始化validation器:

 $('form').validate({ rules: { leftform_input1: { required: true }, leftform_input2: { required: true } }, messages: { leftform_input1: "Field is required", leftform_input2: "Field is required" } }); 

然后,我可以通过执行以下操作来从确认器中获取确切的设置:

 var settings = $('form').validate().settings; 

然后,我可以轻松地使用这个设置对象添加或删除表单的validation器。

这是你将如何删除validation规则:

 var settings = $('form').validate().settings; delete settings.rules.rightform_input1; delete settings.messages.rightform_input1; 

这就是你如何添加validation规则:

 var settings = $('form').validate().settings; settings.rules.leftform_input1 = {required: true}; settings.messages.leftform_input1 = "Field is required"; 

这是我的问题的情况下的工作解决scheme。 我使用jQuery的extend()方法来覆盖validate对象的rulesmessages属性,这就是我在两个面板之间切换的方式。

 $('#toggleSwitch').click(function() { var settings = $('form').validate().settings; var leftForm = $('#leftform'); var rightForm = $('#rightform'); if (leftForm.css("visibility") !== "hidden") { leftForm.css("visibility", "hidden"); rightForm.css("visibility", "visible"); $.extend(settings, { rules: { rightform_input1: { required: true }, rightform_input2: { required: true } }, messages: { rightform_input1: "Field is required", rightform_input2: "Field is required" } }); } else { rightForm.css("visibility", "hidden"); leftForm.css("visibility", "visible"); $.extend(settings, { rules: { leftform_input1: { required: true }, leftform_input2: { required: true } }, messages: { leftform_input1: "Field is required", leftform_input2: "Field is required" } }); } }); 

如果你想用新的设置(规则,消息等)再次调用validation

 $('#formid').removeData('validator') 

这将删除窗体的validation,然后用新的设置重新初始化

validate.rules散列内的“required”声明不必被静态声明为“true”。 你实际上可以提供一个匿名函数,它可以检查某些东西的可见性,并根据答案返回true或false。

 $('form').validate({ rules: { rightform_input1: { required: function(){ return $('#leftform').css("visibility") !== "hidden" } }, rightform_input2: { required: function(){ return $('#leftform').css("visibility") !== "hidden" } } } }); 
 $('#form_id').validate();//empty rules //add rules/message to form element $('#form_id #inputId').rules("add", { required : true, messages : { required : 'Add your required message' } }); 

我写了编辑规则的小函数(只需要)。

  $.editRules = function($array, $type) { var settings = $('#signupForm').validate().settings; $.each($array, function($k, $v) { settings.rules[$v] = {required: ($type == 'add' ? true : false)}; }); }; 

虽然还有其他方法可以做到这一点,ASP.net确实允许您使用多个表单标签,只要它们不是全部呈现 – 所以如果您使用多视图只显示相关的内容,您可以使用多个表单。

它倾向于清理validation并提交处理相当多。


或者,jQuery不允许:可见被添加到你的select器,所以你可能只能运行在可见元素的select器,并回避这个问题,这取决于他们如何被隐藏。

如何计算可见性在jQuery 1.3.2中已更改。 如果元素和父元素占用文档中的空间,则元素被视为可见。 CSS可见性不被考虑在内。 发行说明更详细地概述了更改。


这是另外一篇关于堆栈溢出的更好/更简单的解决scheme –

显然,validation插件允许您指定:在规则中可见。 这里是post-

高级jQueryvalidation:避免对某些条件进行validation