2012-05-24 193 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>标签,但由于它是空的,因此不可见。这可以帮助您识别代码破碎的位置。

另一个注意事项(对于那些不能随便扔一个调试器的语言来说尤其如此):通常最好先创建一个你编码的最简单的骨骼版本。这使您可以开发迭代,并且可以更轻松地跟踪代码破解的位置。试试我的帖子顶部的示例代码,看看你是否能够正常工作。