jQuery Validate-对隐藏字段启用验证


186

在新版本的jQuery验证插件1.9中,默认情况下忽略隐藏字段的验证。我将CKEditor用于textarea输入字段,它隐藏了该字段并将其替换为iframe。该字段在那里,但是对隐藏字段禁用验证。使用验证插件1.8.1时,所有功能均按预期工作。

所以我的问题是如何使用v1.9验证插件启用隐藏字段的验证。

此设置无效:

$.validator.setDefaults({ ignore: '' });


“忽略隐藏字段的验证”链接无效。
Beepye

默认情况下,验证对我有效<input type="text" name="myfield" id="myfield" required="required" style="display: none;">。我不必更改任何设置或做任何特殊的事情。
squarecandy18年

Answers:


329

该插件的作者说,您应该使用“不带引号的方括号”[]

http://bassistance.de/2011/10/07/release-validation-plugin-1-9-0/

发布:Validation Plugin 1.9.0: “ ...另一项更改应使带有隐藏元素的表单的设置更加容易,默认情况下这些元素现在将被忽略(选项“ ignore”现在默认为“:hidden”。)理论上,这是可能会破坏现有的设置。在不太可能的情况下,您可以通过将ignore-option设置为“ []”(不带引号的方括号)来修复它。

要为所有表格更改此设置:

$.validator.setDefaults({ 
    ignore: [],
    // any other default options and/or rules
});

(不需要.setDefaults()document.ready功能内)

或以一种特定形式:

$(document).ready(function() {

    $('#myform').validate({
        ignore: [],
        // any other options and/or rules
    });

});

编辑

有关如何在某些隐藏字段上启用验证但仍忽略其他字段的信息,请参见此答案


编辑2

在留下“这是行不通的”的评论之前,请记住,OP只是在询问jQuery Validate插件,而他的问题与ASP.NET,MVC或任何其他Microsoft框架如何改变此插件的正常状态无关。预期的行为。如果您使用的是Microsoft框架,则jQuery Validate插件的默认功能会被Microsoft的unobtrusive-validation插件覆盖。

如果您在使用unobtrusive-validation插件,请参考以下答案:https : //stackoverflow.com/a/11053251/594235


26
也许投票者可以给我一些建设性的反馈。否则,答案是完全独立的,正确来源的,给出了代码示例,并且在技术上按照插件作者的观点是正确的。
Sparky

1
@StijnVanBael,不,那是错误的。请参阅: jsfiddle.net/F4w92/1,另请参阅我对jerick的回答的第二条评论。
Sparky

4
说得好@Sparky。反对票很可能是报仇,我也遇到过同样的
Omar

1
JSFiddle不再起作用,因为这些库是用HTTP而不是HTTPS加载的。更新版本:jsfiddle.net/F4w92/31
hotips 2015年

1
我也投票赞成,因为使用最新版本对我不起作用,必须使用:$(“ form”)。data(“ validator”)。settings.ignore =“”; @James bellow的其他回答
Mark Homer

71

在ASP.NET MVC3站点中,这对我有用,在该站点中,我离开了框架来设置非侵入式验证等,以防对任何人有用:

$("form").data("validator").settings.ignore = "";

2
我也喜欢这个,因为它意味着我可以在某些情况下做到这一点,而不是更改默认行为。
史蒂夫·欧文

5
我必须这样做,因为使用.validate()更改选项无法正常工作。
Farinha 2014年

1
这是用于非侵入式验证的正确解决方案,我尝试了所有其他解决方案,它们可以在不使用非侵入式的情况下起作用。如果您使用的是不引人注意的地方,那么这里是正确的地方。
哈坎·菲斯特克(HakanFıstık),2016年

必须也使用此方法进行不
干扰的

当我将其更改为该格式时,该表单未通过验证。我使用不显眼的.net核心
Offir Pe'er

64

确保放

 $.validator.setDefaults({ ignore: '' });

不在里面$(document).ready


2
极好的答案。指向文档的链接对人们来说很容易学习,但是简单的答案是更有价值的imo。他的OP在正确的轨道上,但是将其放在$ {document)之外。
凯文Zych

3
@KevinZych,显然,$.validator.setDefaults()放在DOM就绪处理程序的内部还是外部完全没有区别。将此jsFiddle该jsFiddle进行比较。
Sparky

有趣的@Sparky,您的小提琴就是最好的证明。我必须回头查看使用此解决方案修复的代码,并找出为什么得出这样的结论:它必须在DOM ready处理程序中。一定是其他原因。
凯文·泽奇

贾斯汀(Justin)解释了为什么在doc ready中运行会导致问题。但是,此答案不是一个好的选择,因为很难保证在文档准备就绪之前,文档准备就绪之外的其他东西将运行。Doc.ready不会等待其外部的脚本运行。没什么私人的,但这不是一个可靠的答案。
AaronLS 2013年

终于我有了一个答案。.非常感谢您
sp9 2015年

29

因此,我将深入探讨为什么这种方法不起作用,因为我是那种在晚上不知道哈哈就无法入睡的人。我正在使用jQuery validate 1.10和Microsoft jQuery Unobtrusive Validation 2.0.20710.0(发布于2013年1月29日)。

我首先在jQuery Validate中搜索setDefaults方法,并在未缩小文件的第261行找到了它。此功能真正要做的就是将您的json设置合并到现有的设置中,这些设置$.validator.defaults通过将ignore属性设置为“:hidden”以及jQuery Validate中定义的其他默认值进行初始化。因此,在这一点上,我们已经忽略了忽略。现在,让我们看一下该默认属性的引用位置。

当我跟踪代码以查看$.validator.defaults正在引用的位置。我注意到,构造函数仅将其用于表单验证器,jQuery中的第170行验证未缩小的文件。

// constructor for validator
$.validator = function( options, form ) {
    this.settings = $.extend( true, {}, $.validator.defaults, options );
    this.currentForm = form;
    this.init();
};

此时,验证器将合并已设置的所有默认设置,并将其附加到表单验证器。当您查看正在执行验证,突出显示,取消突出显示等的代码时,它们都使用validator.settings对象来提取ignore属性。因此,我们需要确定是否要使用setDefaults方法设置忽略,然后必须在调用$(“ form”)。validate()之前进行忽略。

如果您使用的是Asp.net MVC和不引人注目的插件,那么在查看document.ready中调用validate的javascript之后,您将意识到。 我还在document.ready块中调用了setDefaults,它将在脚本,jquery验证且不引人注意之后执行,因为我已经在html中定义了这些脚本的脚本之前定义了这些脚本。因此,我的电话显然对验证期间跳过隐藏元素的默认功能没有影响。这里有两个选择。

选项1-正如胡安·梅拉多(Juan Mellado)所指出的那样,您可以将调用置于document.ready之外,该调用将在脚本加载后立即执行。我不确定这样做的时机,因为浏览器现在能够执行并行脚本加载。如果我只是过于谨慎,请纠正我。另外,可能有解决方法,但出于我的需要,我没有走这条路。

选项2a-我可以肯定的选择是$.validator.setDefaults({ ignore: '' });,将document.ready事件的内部替换为$("form").data("validator").settings.ignore = "";。当对给定表单的元素进行每次验证时,这将修改jQuery validate实际使用的ignore属性。

选项2b-在看了一些代码之后,您还可以将其$("form").validate().settings.ignore = "";用作设置ignore属性的一种方式。原因是,在查看validate函数时,它检查以查看是否已通过该$.data()函数为form元素存储了验证器对象。如果找到与form元素一起存储的验证器对象,则仅返回该验证器对象,而不创建另一个对象。


感谢您的详细回答!
davidallyoung

好的工作,因为OP答案在MVC 5中对我不起作用
Mark Homer

您的分析对解决我的验证问题有很大帮助。+1
pgcan'5

15

这在ASP.NET站点中对我有用。要对某些隐藏字段启用验证,请使用此代码

$("form").data("validator").settings.ignore = ":hidden:not(#myitem)";

要启用对表单所有元素的验证,请使用此元素 $("form").data("validator").settings.ignore = "";

请注意,在 $(document).ready(function() { })


8

只需ignore: []在特定表单的特定页面中添加此解决方案即可。

$("#form_name").validate({
        ignore: [],
        onkeyup: false,
        rules: {            
        },      
        highlight:false,
    });


0

验证对我来说是表单提交方面的工作,但它并未对选择的选择列表的输入进行反应式事件驱动的验证。

为了解决这个问题,我添加了以下内容来手动触发库添加的jquery验证事件:

$(".chosen-select").each(function() {
  $(this).chosen().on("change", function() {
    $(this).parents(".form-group").find("select.form-control").trigger("focusout.validate");
  });
});

现在,jquery.validate会将.valid类添加到基础选择列表中。

注意:表单输入确实需要一致的html模式。就我而言,每个输入字段都包裹在中div.form-group,每个输入都有.form-control


-15

只需在您的jquery验证文件中找到文本ignore:“:hidden”并将其注释即可。评论后,它将永远不会丢失任何要验证的隐藏元素...

谢谢


5
随机注释掉第三方库中的代码永远不是一个好主意。
雅克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.