无法阅读属性" setCustomValidity'是吗?

时间:2015-06-04 06:39:52

标签: javascript jquery

我有这个脚本:

 (function (exports) {
        function valOrFunction(val, ctx, args) {
            if (typeof val == "function") {
                return val.apply(ctx, args);
            } else {
                return val;
            }
        }

        function InvalidInputHelper(input, options) {
            input.setCustomValidity(valOrFunction(options.defaultText, window, [input]));

            function changeOrInput() {
                if (input.value == "") {
                    input.setCustomValidity(valOrFunction(options.emptyText, window, [input]));
                } else {
                    input.setCustomValidity("");

                }
            }

            function invalid() {
                if (input.value == "") {
                    input.setCustomValidity(valOrFunction(options.emptyText, window, [input]));
                } else {
                    console.log("INVALID!"); input.setCustomValidity(valOrFunction(options.invalidText, window, [input]));
                }
            }

            input.addEventListener("change", changeOrInput);
            input.addEventListener("input", changeOrInput);
            input.addEventListener("invalid", invalid);
        }
        exports.InvalidInputHelper = InvalidInputHelper;
    })(window);



    InvalidInputHelper(document.getElementById("firstname"), {
        defaultText: "Please enter an firstname !",
        emptyText: "Please enter an firstname!",
        invalidText: function (input) {
            return 'The firstnames "' + input.value + '" is invalid!';
        }
    });

我有这个文本框:

  @Html.TextBoxFor(m => m.Register.FirstName, new { id = "firstname", @class = "form-control", @required = "required" })

但我收到错误无法读取属性' setCustomValidity'控制台中的null ...我做错了什么?我看到它在这里工作http://jsfiddle.net/B4hYG/437/但对我来说它不是......它是因为mvc还是什么?

2 个答案:

答案 0 :(得分:2)

那个脚本,你的代码在哪里?我猜它位于标题中?

在您的示例中,如果您将左上角的第二个下拉列表更改为No wrap - in <head>,则会出现您所描述的错误,并且您可以看到它已被破坏here

这是因为您的元素尚未创建。您需要将InvalidInputHelper函数调用移动到页面底部,以便在创建元素后运行它,或者您需要将其包装在函数中,以告诉它在一切运行之前不会触发。

如果您肯定使用jQuery,可以使用ready函数包装它,如下所示:

$('document').ready(function(){
    InvalidInputHelper(document.getElementById("firstname"), {
        defaultText: "Please enter an firstname !",
        emptyText: "Please enter an firstname!",
        invalidText: function (input) {
            return 'The firstnames "' + input.value + '" is invalid!';
        }
    });
});

here it is working

或者,如果您更喜欢纯JavaScript解决方案,则可以使用找到here的vanilla替代方案。

重申一下,如果可以,最简单的方法是将呼叫转移到页面底部。

答案 1 :(得分:1)

我不能&#34;添加评论&#34; ...我在这里回复......

我认为问题可能是&#39; document.getElementById(&#34; firstname&#34;)&#39;。

在DOM准备好之后你能得到它吗? (我不知道MVC是如何工作的)

尝试输入您的代码:

InvalidInputHelper(document.getElementById("firstname"), {
    defaultText: "Please enter an firstname !",
    emptyText: "Please enter an firstname!",
    invalidText: function (input) {
        return 'The firstnames "' + input.value + '" is invalid!';
    }
});

在文档加载函数中 (jquery的例子:     $(function() { /* your code here */ });