所以我的问题是如何在v1.9验证插件中启用对隐藏字段的验证。
这个设置不起作用:
$.validator.setDefaults({ ignore: '' });
$.validator.setDefaults({ ignore: '' });
[]
,即“不带引号的方括号”。
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
unobtrusive-validation
插件如何干扰jQuery Validate的正常功能无关。 - Sparky这个方法对我在 ASP.NET MVC3 网站中留下了设置非侵入式验证等框架的情况下有效,如果有用的话:
$("form").data("validator").settings.ignore = "";
$.validator.setDefaults({ ignore: '' });
不要放在 $(document).ready
内部
$.validator.setDefaults()
放在DOM准备好的处理程序内部还是外部都没有任何区别。请将此 jsFiddle链接与另一个jsFiddle链接进行比较。 - Sparky我将深入探讨为什么这不起作用,因为我是那种无法在没有答案的情况下入睡的人。我使用的是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对象。
这对我在 ASP.NET 网站中有效。 要启用某些隐藏字段的验证,请使用以下代码:
$("form").data("validator").settings.ignore = ":hidden:not(#myitem)";
要为表单的所有元素启用验证,请使用以下代码:
$("form").data("validator").settings.ignore = "";
请注意,在$(document).ready(function() { })
中使用它们。
我在具体页面的具体表单中添加了ignore: []
,这个解决方案对我很有效。
$("#form_name").validate({
ignore: [],
onkeyup: false,
rules: {
},
highlight:false,
});
这对我来说可行。
jQuery("#form_name").validate().settings.ignore = "";
在表单提交时,验证对我起作用,但它并没有在输入到所选选择列表上进行反应式事件驱动的验证。
为了解决这个问题,我添加了以下内容,手动触发由库添加的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
。
只需在您的jQuery验证文件中找到文本ignore:“:hidden”并将其注释掉。 注释后,它将永远不会丢失任何隐藏元素以进行验证...
谢谢
<input type="text" name="myfield" id="myfield" required="required" style="display: none;">
。我不需要更改任何设置或进行特殊操作。 - squarecandy