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>空なので表示されません。これは、コードが壊れている場所を特定するのに役立ちます。

もう 1 つの注意点 (これは特に、デバッガーを使用できない言語の場合に当てはまります): 一般に、最初にコーディングする内容の必要最小限のバージョンを作成することをお勧めします。これにより、繰り返し開発することができ、コードがどこで壊れているかを追跡するのが非常に簡単になります。私の投稿の上部にあるサンプル コードを試して、正しく機能するかどうかを確認してください。

于 2012-05-29T18:25:49.960 に答える