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

205
在jQuery验证插件的新版本1.9中,默认情况下忽略隐藏字段的验证。我正在使用CKEditor作为文本输入字段,并将其隐藏并替换为iframe。该字段存在,但是对于隐藏字段禁用了验证。使用验证插件版本1.8.1时,一切都按预期工作。
所以我的问题是如何在v1.9验证插件中启用对隐藏字段的验证。
这个设置不起作用:
$.validator.setDefaults({ ignore: '' });

1
请参见https://dev59.com/ymsz5IYBdhLWcg3wWmfL。 - goodeye
"validation of hidden fields ignored" 的链接已失效。 - Beepye
验证对我来说默认是有效的,使用<input type="text" name="myfield" id="myfield" required="required" style="display: none;">。我不需要更改任何设置或进行特殊操作。 - squarecandy
9个回答

355
插件作者建议您使用方括号[],即“不带引号的方括号”http://bassistance.de/2011/10/07/release-validation-plugin-1-9-0/ 发布:验证插件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的unobtrusive-validation插件会覆盖jQuery Validate插件的默认功能。

如果您遇到unobtrusive-validation插件方面的问题,请参考此答案:https://dev59.com/02oy5IYBdhLWcg3wkO2g#11053251


29
或许投反对票的人可以给我一些有建设性的反馈。否则,答案完整自包含、资料来源正确,提供了代码示例,并且根据插件作者的要求是技术上正确的。 - Sparky
4
说得好,@Sparky。这些踩可能是出于报复心理,我也遇到过类似情况.. - Omar
1
JSFiddle现在无法正常工作,因为库是通过HTTP加载而不是HTTPS。更新版本:https://jsfiddle.net/F4w92/31/ - hotips
1
我也点了踩,因为这对我来说在使用最新版本时不起作用,我不得不使用:$("form").data("validator").settings.ignore = "";,就像下面@James的另一个答案一样。 - Mark Homer
1
@MarkHomer,看一下我上面回答的最新编辑。我的回答确切而正确地仅涉及到了问题的提出者(OP),与Microsoft的unobtrusive-validation插件如何干扰jQuery Validate的正常功能无关。 - Sparky
显示剩余7条评论

83

这个方法对我在 ASP.NET MVC3 网站中留下了设置非侵入式验证等框架的情况下有效,如果有用的话:

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

2
我也喜欢这个选项,因为它意味着我可以在特定情况下执行操作,而不是更改默认行为。 - Steve Owen
6
我必须这样做,因为使用.validate()方法更改选项并不起作用。 - Farinha
1
这是无侵入式验证的正确解决方案,我尝试了所有其他解决方案,它们可能在不使用无侵入式时起作用。如果您正在使用无侵入式,则此处是正确的位置。 - Hakan Fıstık
必须使用这种方法才能使不显眼的验证与Bootstrap手风琴一起工作。 - bsod_
当我将其更改为此时,表单未经验证。 我使用不显眼的 .net core。 - Offir
这仍然是针对 .net core 3.1 和非侵入式验证的正确解决方案... 再次感谢。 - DiscipleMichael

69
请提供完整的需要翻译的内容。
 $.validator.setDefaults({ ignore: '' });

不要放在 $(document).ready 内部


2
非常好的回答。提供文档链接有助于人们学习,但我认为直接回答更有价值。原帖作者走在正确的道路上,但将其放在$(document).ready之外是关键。 - Kevin Zych
4
据@KevinZych所说,无论$.validator.setDefaults()放在DOM准备好的处理程序内部还是外部都没有任何区别。请将此 jsFiddle链接另一个jsFiddle链接进行比较。 - Sparky
Justin解释了为什么在doc ready内运行会导致问题。然而,这个答案并不是一个好的选择,因为很难保证doc ready之外的某些东西会在doc ready之前运行。Doc.ready不会等待它外部的脚本运行。没有任何人身攻击,但这不是一个可靠的答案。 - AaronLS
最终我有一个答案了...非常感谢。 - sp9
对我来说起作用了,在dom.ready之外,包含js验证器脚本后面立即使用它!仍然不知道为什么! - RazvanR
显示剩余3条评论

31

我将深入探讨为什么这不起作用,因为我是那种无法在没有答案的情况下入睡的人。我使用的是jQuery validate 1.10和Microsoft jQuery Unobtrusive Validation 2.0.20710.0,该版本发布于2013年1月29日。

我从jQuery Validate中搜索了setDefaults方法,并在未压缩文件的第261行找到它。这个函数实际上只是将你的json设置合并到现有的$.validator.defaults中,而这些默认值会被初始化为": hidden",以及在jQuery Validate中定义的其他默认值。所以此时我们已经覆盖了ignore。现在让我们看看这个defaults属性在哪里被引用。

当我追踪代码以查看何处引用了$.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对象从中提取忽略属性。因此,如果要使用setDefaults方法设置忽略属性,则必须在调用 $ ("form").validate()之前进行设置。

如果您正在使用Asp.net MVC和无侵入式插件,则在查看了javascript后,您将意识到验证是在document.ready中调用的。我还在document.ready块中调用了我的setDefaults,它将在脚本jquery validate和无侵入式之后执行,因为我已在html中定义了这些脚本,在该脚本之前具有调用。因此,我的调用显然对跳过验证期间的隐藏元素的默认功能没有影响。这里有几个选项。

选项1 - 您可以像Juan Mellado指出的那样将调用放在document.ready之外,这将在脚本加载完毕后立即执行。 我不确定这个时间安排,因为现在浏览器能够进行并行脚本加载。 如果我只是过于谨慎,请纠正我。 此外,可能有解决此问题的方法,但对于我的需求,我没有走这条路。

选项2a - 在我的眼中,安全的选择就是用 $("form").data("validator").settings.ignore = ""; 代替 document.ready事件中的 $.validator.setDefaults({ ignore: '' });。这将修改jQuery validate在给定表单的每个元素进行每次验证时实际使用的忽略属性。

选项2b - 仔细查看代码后,您还可以使用$("form").validate().settings.ignore = "";来设置忽略属性。原因是当查看validate函数时,它检查是否已通过$.data()函数为表单元素存储了验证器对象。 如果它发现已经存储了一个validator对象,则会返回该validator对象而不是创建另一个validator对象。


感谢您提供详细的回答! - davidallyoung
好的工作,因为OP的答案在MVC 5中对我无效。 - Mark Homer
你的分析帮助我解决了一个验证问题,非常感谢。+1 - pgcan

18

这对我在 ASP.NET 网站中有效。 要启用某些隐藏字段的验证,请使用以下代码:

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

要为表单的所有元素启用验证,请使用以下代码: $("form").data("validator").settings.ignore = "";

请注意,在$(document).ready(function() { })中使用它们。


9

我在具体页面的具体表单中添加了ignore: [],这个解决方案对我很有效。

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

2

这对我来说可行。

jQuery("#form_name").validate().settings.ignore = "";

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


-18

只需在您的jQuery验证文件中找到文本ignore:“:hidden”并将其注释掉。 注释后,它将永远不会丢失任何隐藏元素以进行验证...

谢谢


6
随意注释第三方库中的代码从来都不是一个好主意。 - Jacques

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接