jQuery 验证器 - 无法调用未定义错误的方法“call” - 动态添加验证时

问题描述 投票:0回答:6

这是我动态更新 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"
  }

  });

如何解决这个问题?

jquery jquery-validate
6个回答
23
投票

有四个潜在问题。

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
 规则已经在寻找精确的格式/长度。


9
投票
我也遇到了同样的问题,但原因不同。当我放置规则“require:true”而不是“required:true”时,会发生同样的问题。

当您在规则中指定没有相应方法的验证时,会发生此错误。通过调试我发现异常显示我通过方法名称指定了规则“require”为“require”。它尝试访问哈希映射中的方法,并尝试 .call() 即使未找到该方法,这会导致异常。

如果插件作者在这种情况下只是抛出一个自定义错误,指出“规则‘require’没有方法”,那么调试和识别拼写错误会更容易。

这也是插件提交时臭名昭著的问题的相同原因,即使字段无效。查看我的问题报告并为其投票 -

https://github.com/jzaefferer/jquery-validation/issues/1212


8
投票
作为相关错误,如果添加自定义规则,请使用:

$.validator.addMethod('field-is-valid', function (val, element) { ...})

但随后在规则声明中使用错误的名称引用它:

$(element).rules('add', { "field-valid": true })

你会得到同样的

Cannot call method call of undefined


1
投票
运行此示例代码时发生错误:

$(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”。


0
投票
上面的代码不起作用,因为属性列表后面缺少

}


-2
投票
您还需要添加此附加方法

http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/additional-methods.js

© www.soinside.com 2019 - 2024. All rights reserved.