我怎样才能添加,删除或交换页面的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
对象的rules
和messages
属性,这就是我在两个面板之间切换的方式。
$('#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