jQueryvalidation器 – 无法调用未定义错误的方法’调用’ – 动态添加validation

这是我动态更新jQueryvalidation的代码。 在文档加载中,我创建validation。 此代码用于动态更新电话号码validation。 应用此validation后,当我在电话号码文本框中输入任何内容时,我无法调用未定义错误的方法“调用”。

$("#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)存在一个已知的错误 ,即使用rules('add')方法添加messages会破坏插件和/或规则。 确保您包含jQuery Validate版本1.11.1或更高版本

3) phoneUS规则要求包含additional-methods.js文件 。

4) rules('add')方法必须 .validate()初始化函数之后。

注意

您使用的是phoneUS规则,因此,如果phoneUS规则已经在寻找精确的格式/长度,则phoneUSmaxlength完全是多余的。

我有同样的问题,但原因不同。 当我将规则“re​​quire:true”而不是“required:true”放置时,会出现同样的问题。

当您在规则中指定没有相应方法的validation时,会发生此错误。 通过调试我发现exception显示我指定了一个规则“re​​quire”,方法名称是“required”。 它尝试访问hashmap中的方法,并尝试.call(),即使找不到该方法,也会导致exception。

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

即使字段无效,这也是插件提交臭名昭着的原因。 查看并投票选择我的问题报告 – https://github.com/jzaefferer/jquery-validation/issues/1212

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

 $.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, 

程序将抛出上述exception。 将ANY或BOTH选项设置为’true’时就是这种情况。 另一方面,如果您将BOTH设置为’false’或将ONE设置为’false’并删除另一个,则它将按预期工作。

最重要的是:如果你删除或注释掉这些选项中的任何一个,你删除的那个将被设置为默认值,这是’true’并且WON“T抛出任何错误。所以有可能完全按照自定义validation插件的方式你想要的,你只需要记住不要明确地将这些选项设置为’true’。

我希望这可以帮助某人,尽管这个特定用户的这个问题的实际问题已经解决了。

上面的代码不起作用,因为它在属性列表后丢失了}