使用取决于jQuery Validation插件

我有一个带有一堆默认禁用的文本框的表单,然后通过使用每个文本框旁边的复选框启用。

启用时,这些文本框中的值必须是有效数字,但在禁用时,它们不需要值(显然)。 我正在使用jQuery Validation插件来进行此validation,但它似乎没有按照我的预期进行。

当我单击复选框并禁用文本框时,尽管我已添加到规则中的depends子句,但仍然会收到无效字段错误(请参阅下面的代码)。 奇怪的是,实际发生的是错误消息显示一瞬间然后消失。

以下是复选框和文本框列表的示例:

 

这是我正在使用的jQuery代码

 //Wire up the click event on the checkbox jQuery('#ItemList :checkbox').click(function(event) { var textBox = jQuery(this).siblings(':text'); textBox.valid(); if (!jQuery(this).attr("checked")) { textBox.attr('disabled', 'disabled'); textBox.val(''); } else { textBox.removeAttr('disabled'); textBox[0].focus(); } }); //Add the rules to each textbox jQuery('#ItemList :text').each(function(e) { jQuery(this).rules('add', { required: { depends: function(element) { return jQuery(element).siblings(':checkbox').attr('checked'); } }, number: { depends: function(element) { return jQuery(element).siblings(':checkbox').attr('checked'); } } }); }); 

忽略每个li的隐藏字段,因为我使用的是asp.net MVC的Html.Checkbox方法。

使用“忽略”选项( http://docs.jquery.com/Plugins/Validation/validate#toptions )可能是您处理此问题的最简单方法。 取决于您在表单上还有什么。 对于ie,如果您有其他已禁用但仍需要validation的控件,则不会过滤禁用的项目。 但是,如果该路由不起作用,则使用其他类进行过滤(使用复选框添加和删除)可以使您到达目的地,但更容易。

  $('form').validate({ ignore: ":disabled", ... }); 

通常在执行此操作时,我会跳过’depends’并只使用required jQuery Validate规则并让它根据给定的选择器处理检查,而不是在validation规则和复选框单击处理程序之间拆分逻辑。 我用一个标记快速演示了如何实现这一目标。

真的,归结为required:'#OneSelected:checked' 。 这使得只有在表达式为真时才需要该字段。 在演示中,如果您立即提交页面,它可以正常工作,但是当您选中复选框时,表单无法提交,直到选中的字段填充了一些输入。 如果您希望整个表单在单击时validation,您仍然可以在复选框单击处理程序中放置.valid()调用。

(另外,我缩短了你的复选框切换,利用jQuery的精彩链接function,虽然你对textBox “缓存”同样有效。)

取决于参数不能正常工作,我想文档已经过时了。 我设法得到这样的工作:

 required : function(){ return $("#register").hasClass("open")} 

关注@Collin Allen回答:

问题是,如果您在错误消息可见时取消选中复选框,则错误消息不会消失。

我通过在禁用字段时删除错误消息解决了这个问题。

以Collin的演示为例,对启用/禁用过程进行以下更改:

 jQuery('#ItemList :checkbox').click(function() { var jqTxb = $(this).siblings(':text') if ($(this).attr('checked')) { jqTxb.removeAttr('disabled').focus(); } else { jqTxb.attr('disabled', 'disabled').val(''); var obj = getErrorMsgObj(jqTxb, ""); jqTxb.closest("form").validate().showErrors(obj); } }); function getErrorMsgObj(jqField, msg) { var obj = {}; var nameOfField = jqField.attr("name"); obj[nameOfField] = msg; return obj; } 

您可以看到我在禁用它时从字段中删除错误消息

如果你担心$("form").validate() ,不要! 它不会重新validation它只返回jQueryvalidation的API对象的表单。

我不知道这是不是你想要的……但是不会改变。需要更改.wasReq(作为占位符来区分这个与可能不需要的东西)在检查框中做同样的事情事情? 如果没有选中,则不需要该字段 – 您也可以删除类(数字)以消除那里的错误。

据我所知,即使某个字段被禁用,应用它的规则仍然适用。 或者,你总是可以尝试这个……

 // Removes all values from disabled fields upon submit $(form).submit(function() { $(input[type=text][disabled=disabled]).val(); }); 

我没有尝试过validation器插件,但是消息显示为splitsecond的事实听起来像双重绑定,你怎么称呼你的绑定器? 如果你绑定一个函数,请在开始之前尝试取消绑定,如下所示:

 $('#ItemList :checkbox').unbind("click"); ...Rest of code here... 

禁用/启用后不应validation字段?

 jQuery('#ItemList :checkbox').click(function(event) { var textBox = jQuery(this).siblings(':text'); if (!jQuery(this).attr("checked")) { textBox.attr('disabled', 'disabled'); textBox.val(''); } else { textBox.removeAttr('disabled'); textBox[0].focus(); } textBox.valid(); }); 

我有同样的问题。

我通过让单选按钮更改事件处理程序在整个表单上调用valid()来解决这个问题。

工作完美。 上面的其他解决方案对我不起作用。