4

我有一个与 jquery 验证器一起使用的自定义验证方法。我试图让错误消息动态生成。

我用谷歌搜索过,我最常看到的答案显示在这个 stackoverflow 帖子中。

但是,当我尝试自己实现它时,它不起作用。它只是忽略我更新的消息,只显示原始消息。

这是我的代码,位于 jquery.ready() 函数内。我究竟做错了什么?

注意:“g$”是我们对 jquery 的简写。

    var jsBlackoutDateMessage = "Tournaments cannot be scheduled on blackout dates.";
    var jsBlackoutDateMessageFunction = function () {
        return jsBlackoutDateMessage;
    };
    g$.validator.addMethod(
    "notBlackoutDate",
    function (value, element) {

        var notBlackoutDate = true;

        if (g$.inArray(value, jsBlackoutDates) != -1) {
            notBlackoutDate = false;
        }

        if (notBlackoutDate == false) {

            // year
            var year = new Date(g$.trim(g$('#txtDate').val())).getFullYear();

            var blackoutDatesForYear = jsBlackoutDates.filter(function (item) {
                return endsWith(item, year.toString());
            })[0];

            var blackoutDatesForYearMessage = [];
            blackoutDatesForYearMessage.push("Tournaments cannot be scheduled on blackout dates.");
            blackoutDatesForYearMessage.push("<ul>");

            g$.each(blackoutDatesForYear, function (key, value) {
                blackoutDatesForYearMessage.push("<li>");
                blackoutDatesForYearMessage.push(new Date(value).toLocaleDateString());
                blackoutDatesForYearMessage.push("</li>");
            });

            blackoutDatesForYearMessage.push("</ul>");

            jsBlackoutDateMessage = blackoutDatesForYearMessage.join("");
        }

        return this.optional(element) || notBlackoutDate;
    },
    jsBlackoutDateMessageFunction
);
4

1 回答 1

7

我冒昧地猜测这与过滤器有关,或者每个功能都无法正常运行。我尝试将您的代码简化为最简单的组件并想出了这个(这在我的最终工作正常):

var message = "Original Message";
var messageFunc = function () { return message; };

$.validator.addMethod("messageTest", function (value, element) {
        var newMessage = [];

        newMessage.push("Original Message");
        newMessage.push(" - Plus new message");

        message = newMessage.join("");

        // We will always return false, so that
        // the message always shows
        return this.optional(element) || false;
    }, messageFunc);

$("#testId").rules("add", { messageTest: true });

在您的代码上,尝试替换:

jsBlackoutDateMessage = blackoutDatesForYearMessage.join("");

$("#someDivID").html( blackoutDatesForYearMessage.join("") );

其中 someDivID 是表单上可见的 div。通过这种方式,您可以使用 FireBug 来检查正在写下的实际 HTML。可能是它包含初始<ul></ul>标签,但由于它是空的,因此不可见。这将帮助您确定代码中断的位置。

另一个注意事项(对于不能只使用调试器的语言尤其如此):通常,最好先为您正在编码的任何内容创建一个简单的版本。这使您可以进行迭代开发,并使跟踪代码中断的位置变得更加容易。试试我帖子顶部的示例代码,看看你是否能让它正常运行。

于 2012-05-29T18:25:49.960 回答