2012-05-24 130 views
3

我有一個自定義驗證方法,我正在使用jQuery驗證程序。我試圖讓錯誤消息被動態生成。jquery驗證器addmethod動態消息

我已經使用了Google搜索,並且我最常見的答案顯示在this stackoverflow post中。

但是,當我嘗試自己實現它時,它不起作用。它只是忽略我更新的消息,只顯示原始消息。

這是我的代碼,位於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 
); 
+0

你的意思是使用'g $(this).each'關鍵字代替'g $ .each'嗎? – jmort253

+0

沒有。在我的代碼中,我遍歷數組「blackoutDatesForYear」中的所有元素。 –

+0

你有沒有安裝螢火蟲?您是否在錯誤控制檯中收到任何錯誤? –

回答

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>標籤,但由於它是空的,因此不可見。這可以幫助您識別代碼破碎的位置。

另一個注意事項(對於那些不能隨便扔一個調試器的語言來說尤其如此):通常最好先創建一個你編碼的最簡單的骨骼版本。這使您可以開發迭代,並且可以更輕鬆地跟蹤代碼破解的位置。試試我的帖子頂部的示例代碼,看看你是否能夠正常工作。