这是我动态更新 jQuery 验证的代码。在文档加载中我创建验证。此代码用于动态更新电话号码验证。应用此验证后,当我在电话号码文本框中输入任何内容时,我收到无法调用未定义错误的方法“call”。
$("#phone").rules("remove");
$("#phone")
.rules(
"add",
{
required:true,
minlength:5,
maxlength:20,
phoneUS:true,
messages:{
required: "Enter company phone number",
minlength:"Phone number should contain a minimum of 5 characters",
maxlength:"Phone number should contain a maximum of 20 characters",
phoneUS:"Enter valid phone number"
}
});
如何解决这个问题?
有四个潜在问题。
1)您缺少
messages
部分的右大括号。
$("#phone").rules("add", {
required: true,
phoneUS: true,
messages: {
required: "Enter company phone number",
phoneUS: "Enter valid phone number"
} //<-- this was missing
});
演示:http://jsfiddle.net/A8HQU/2
2)存在一个已知错误,使用
messages
方法添加 rules('add')
会破坏插件和/或规则。绝对确保您包含 jQuery Validate 版本 1.11.1 或更高版本。
3)
phoneUS
规则要求包含 additional-methods.js
文件。
4)
rules('add')
方法必须位于.validate()
初始化函数之后。
注意:
您正在使用phoneUS
规则,因此
minlength
和
maxlength
完全是多余的,因为
phoneUS
规则已经在寻找精确的格式/长度。
当您在规则中指定没有相应方法的验证时,会发生此错误。通过调试我发现异常显示我通过方法名称指定了规则“require”为“require”。它尝试访问哈希映射中的方法,并尝试 .call() 即使未找到该方法,这会导致异常。
如果插件作者在这种情况下只是抛出一个自定义错误,指出“规则‘require’没有方法”,那么调试和识别拼写错误会更容易。
这也是插件提交时臭名昭著的问题的相同原因,即使字段无效。查看我的问题报告并为其投票 -
$.validator.addMethod('field-is-valid', function (val, element) { ...})
但随后在规则声明中使用错误的名称引用它:
$(element).rules('add', {
"field-valid": true
})
你会得到同样的
Cannot call method call of undefined
。
$(document).ready(function () {
$.validator.addMethod("numberEqualTo", function (value, element, parameter) {
return parseInt(value) === parseInt(parameter);
}, "Values must match");
$("#example2").validate({
focusInvalid: false,
onkeyup: true,
onfocusout: true,
errorElement: "div",
errorPlacement: function (error, element) {
error.appendTo("div#errors");
},
rules: {
"example2-fullname": {
required: true,
minlength: 5
},
"example2-phone": {
required: true,
number: true
},
"example2-zip": {
required: true,
number: true,
rangelength: [3, 5]
},
"example2-value": {
required: true,
number: true,
numberEqualTo: 10
}
},
messages: {
"example2-fullname": {
required: "You must enter your full name",
minlength: "First name must be at least 5 characters long"
},
"example2-phone": {
required: "You must enter your phone number",
number: "Phone number must contain digits only"
},
"example2-zip": {
required: "You must enter your zip code",
number: "Zip code must contain digits only",
rangelength: "Zip code must have between 3 to 5 digits"
},
"example2-value": {
required: "You must enter your value",
number: "Value must be a digit",
numberEqualTo: "Value must be equal to 10"
}
}
});
});
为什么?由于某种原因,如果您明确指定:
onkeyup: true,
onfocusout: true,
程序将抛出上述异常。当您将上述任何或两个选项设置为“true”时,就会出现这种情况。另一方面,如果您将两者设置为“假”或将一个设置为“假”并删除另一个,它将按预期工作。最重要的事情:如果您删除或注释掉这些选项中的任何一个,您删除的选项将被设置为默认值,即“true”并且不会抛出任何错误。因此可以完全自定义验证插件按照你想要的方式,你只需要记住不要明确地将这些选项设置为“true”。
}
。