为什么在对象方法中调用addMethod时不会触发jQuery验证?

时间:2018-02-22 22:59:39

标签: javascript jquery jquery-validate unobtrusive-validation

我有这个可爱的课程:

validations.js

var Validation = function () {

    var load= function () {

        $.validator.addMethod("noweirdstuff", function (value, element) {
            return !(/\W/.test(value));}, "Username has invalid characters. Only letters, numbres & underscores allowed.");

        $.validator.unobtrusive.adapters.add("noweirdstuff", function (options) {
            options.rules["noweirdstuff"] = true;
            if (options.message) { options.messages["noweirdstuff"] = options.message;}
        });   
    }

    return {
        init: function () {
            load();
        }
    };

}();

validations.js 与所有javascript代码捆绑在一起并缩小为单个文件。然后,我使用每页脚本只加载所需的代码。在这种情况下:

Validation.init(); 

但它似乎没有激发验证。我100%确定正在调用Validation.init()

只有当我把它带到外面时它才有效:

validations.js

 var Validation = function () {

        var load = function () {  
         // goodbye adding validation         
        }

        return {
            init: function () {
                load();
            }
        };

 }();

 $.validator.addMethod("noweirdstuff", function (value, element) {
                        return !(/\W/.test(value));}, "Username has invalid characters. Only letters, numbres & underscores allowed.");

 $.validator.unobtrusive.adapters.add("noweirdstuff", function (options) {
                        options.rules["noweirdstuff"] = true;
                        if (options.message) { options.messages["noweirdstuff"] = options.message;}
                    });

为什么?

1 个答案:

答案 0 :(得分:0)

这是因为您在加载页面后注册了自定义脚本验证程序。一旦不显眼的验证器加载,验证规则就会应用于整个文档,如果到那时你的规则和验证器没有被添加到堆栈中,它们将被忽略。

我相信你可以在添加规则和验证器之后致电$.validator.unobtrusive.parse(document),我不是100%确定这会起作用,或者是否会应用验证器两次。

编辑:重新回答

修改:添加了可能的解决方案