我目前正在使用jQuery validate插件来验证我的网站中使用的表单。但是,有多种形式可能性,我正在使用一个适合所有验证脚本,它应该针对具有特定类的div中的所有表单。
目前我的验证如下:
$(document).ready(function(){
jQuery.validator.addClassRules({
isemail: {
required: true,
email: true
}
});
jQuery.validator.addMethod("ContainsAtLeastOneDigit", function (value) { return /[a-z].*[0-9]|[0-9].*[a-z]/i.test(value); }, 'Your password must contain at least 1 number');
$(".icams_inserted form").validate({
errorClass : "invalid",
validClass : "valid",
showErrors: function(errorMap, errorList) {
var err = this.numberOfInvalids();
if (err > 1) {
var word = "errors";
var field = "fields";
$("#error_message").html("The form contains " + this.numberOfInvalids() +" "+ word + ". Please correct the highlighted " + field + " below."); this.defaultShowErrors();
}else{
var word = "error";
var field ="field";
if (err < 1) {
$("#error_message").html("");
this.defaultShowErrors();
}else{
$("#error_message").html("The form contains " + this.numberOfInvalids() +" "+ word + ". Please correct the highlighted " + field + " below."); this.defaultShowErrors();
}
}
},
submitHandler: function(form){
/*For the registration form, move the email address the user has entered into the hidden email field*/
if (form.hasClass('prefs')) {
var mail = $('#p_username').val();
$('input[type="hidden"][name="p_email_address"]').val(mail);
}
form.submit();
},
rules : {
p_password:{
minlength: 8,
ContainsAtLeastOneDigit: true
},
p_password_conf:{
equalTo: p_password,
minlength: 8,
ContainsAtLeastOneDigit: true
}
},
messages:{
p_password_conf:{
equalTo: 'The passwords entered do not match'
}
}
});
})
但是,出于某种原因,验证似乎会在每个页面上都有效,甚至是没有任何表单的页面。然后,这会在Firebug中产生以下错误:
ReferenceError: p_password is not defined
equalTo: p_password,
有谁知道这是为什么?我的理解是插件应该仅触发它所针对的元素,在这种情况下,形式包含在具有.icams_inserted类的元素中,但这似乎不是这种情况。我的理解是,只有找到有问题的元素才能进行验证。在这种情况下,页面上没有名称为p_password的元素,因此不应触发验证脚本。我真的不知道为什么会这样做。
我甚至尝试过使用我的整个网站中不存在的虚拟类,但似乎无论如何都会触发验证。任何帮助将不胜感激。
答案 0 :(得分:1)
<强>修:强>
您的错误......
ReferenceError: p_password is not defined
equalTo: p_password,
...如上所述,是由您的错误规则声明造成的......
equalTo: p_password // <-- missing quotes
一定是这样......
equalTo: "#p_password" // <-- targeted by id in this example
As per docs,equalTo
值是另一个字段的“选择器”,它被引号括起来。
编辑:通过jsFiddle,我能够看到equalTo
规则工作,即使没有围绕值的引号。
当页面加载时,正在解析.validate()
调用中的代码,并且只要p_password
字段不存在就会触发错误。 “验证”没有解雇。
原文如下:
引用问题标题:
无论表单是否存在,“jQuery Validate函数都会在每个页面上触发”
“验证”未触发。 .validate()
调用是插件的初始化方法。
引用OP :
“验证似乎在每个页面上都有用,甚至是没有任何表格的页面。”
除非附加表单触发事件,否则“验证”不会启动。当您只是将.validate()
附加到表单时,您只是在该表单上初始化插件。
$('#myform').validate()
≠“验证”
然而,
使用$('#myform').validate()
的表单上的验证插件的 id="myform"
= 初始化
引用OP的评论:
“错误。文档明确指出,以这种方式调用validate应该只验证指定的表单。”
是的,“验证”只会发生在指定的表单上。但是,调用.validate()
不与“验证”相同。调用.validate()
方法只是初始化验证插件的内容。
“验证”只会由插件捕获的其中一个事件触发,例如“按键”,“模糊”或“点击提交按钮”。只需加载页面,“验证”就会不 ...除非您通过测试方法以编程方式触发它,例如.valid()
。