如何在jquery验证错误消息中包含字段标签

5

我正在将jquery验证错误显示在页面顶部。我想在每条消息旁边包含与每个无效字段关联的标签的文本值。如何实现这一点?这是我的jquery代码。

$(document).ready(function(){
    $("#reqAccount").validate({
            errorClass: "error-text",
            validClass: "valid",
            errorLabelContainer: "#errorList",
            wrapper: "li ",
            highlight: function(element, errorClass, validClass) {
                $(element).addClass("error-input").addClass(errorClass).removeClass(validClass);
             },
             unhighlight: function(element, errorClass, validClass) {
                $(element).removeClass("error-input").removeClass(errorClass).addClass(validClass);
             }
        });
    });
4个回答

4

以下是我最终更新消息以包含标签的文本值的方法。错误映射(errorMap)中找到了文本字段的ID,因此我使用它们来查找具有相似ID的标签,并将它们附加到错误列表(errorList)中。如有更好的方法,请评论。

  $(document).ready(function(){
    $("#reqAccount").validate({
        errorClass: "error-text",
        validClass: "valid",
        errorLabelContainer: "#errorList",
        wrapper: "li class='indent error-text'",
        showErrors: function(errorMap, errorList) {
            var i = 0;
            var labelText = new Array(this.numberOfInvalids());
            $.each(errorMap, function(name, value) {
                labelText[i] = $("#" + name + "Label").text();
                i++;
            });
            i = 0;
            $.each(errorList, function(name, value) {
                this.message = labelText[i] + " " + this.message;
                i++;
        });
            this.defaultShowErrors();

         },

        highlight: function(element, errorClass, validClass) {
            $(element).addClass("error-input").addClass(errorClass).removeClass(validClass);
         },
         unhighlight: function(element, errorClass, validClass) {
            $(element).removeClass("error-input").removeClass(errorClass).addClass(validClass);
         }
    });
});

这一行代码:this.message = labelText[i] + " " + this.message; 可以包含在第一个 $.each() 中。似乎没有必要使用第二个 $.each()。或者你需要从 errorList 中包含一些内容吗? - Ritesh
@Ritesh - 第一个 $.each 旨在遍历 errorMap 并创建字段 id 值的数组。使用从 errorMap 中获取的 id 检索与每个字段相关联的标签文本。第二个 $.each 遍历 errorList,这是显示错误的对象。我将第一个 $.each 中检索到的文本添加到 errorList 值中。 - coder

3

如果我理解正确,您可能可以使用 showErrors

$(".selector").validate({
   showErrors: function(errorMap, errorList) {
      //use the fn params to get a map of current errors,
      //then append to your <li> elements
   }
});

参考http://docs.jquery.com/Plugins/Validation/validate的“选项”标签。


1
这很有道理,但是showErrors的文档很少。我怎么知道errorMap包含哪些属性,甚至不知道如何追加它? - coder

2

感谢您发布的答案,您所贴出的showErrors代码帮了我很多。然而,当onfocusout设置为true时,我无法让它为我工作。我不得不稍微修改您的代码,希望这能帮助其他遇到相同问题的人。

showErrors: function(errorMap, errorList) {
                var i = 0;
                var labelText = new Array(this.numberOfInvalids());

                $.each(errorMap, function(name, value) {
                    //I had to change the following line to get the for attribute of the 
                    //label that matches the id of the name
                    var label = $("label[for='" + $('#' + name).attr('id') + "']").text();
                    labelText[i] = label;
                    i++;
                 });
                i = 0;
                $.each(errorList, function(name, value) {
                    //This is where I ran into issues.  With the code you had earlier, the labelText kept
                    //getting appended every time I would change focus from an input.  To get rid of that
                    //I had to run a couple of checks
                    var semi = labelText[i].indexOf(':');
                    var requiredString = 'This field is required';
                    var check = labelText[i].indexOf(requiredString); 

                    if (check != -1) {
                        if (semi != -1 && labelText[i].indexOf(':', semi + 1) != -1) {
                            var indexOfSemi = labelText[i].indexOf(':'); 
                            labelText[i] = labelText[i].substr(0, indexOfSemi); console.log(labelText[i]);
                            this.message = hold + ": " + this.message;
                        }
                    } else {
                        this.message = labelText[i] + " " + this.message;d
                        i++;
                    }
                });
                this.defaultShowErrors();
            },

我只是想说谢谢,并希望这能帮助其他人。


1
$.validator.messages.required = function (param, input) {
     return 'The ' + $("label[for='"+ input.name +"'].lblRequired").text()
     + ' field is required';
}

我使用这个方法,对我来说非常完美。当您使用jQuery选择相应的标签时,请确保为您的标签添加一个额外的标识符(在我的情况下,我添加了类“.lblRequired”)。当验证器触发时,它会创建具有相同“for”属性的新标签,将它们与输入相关联。因此,如果您不添加一个类或其他方式来标识您原始的标签,您将会遇到混乱,因为您会选择错误的标签进行后续验证,并且标签将继续累积错误消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接