jquery验证插件。生成随机成功消息一次

时间:2010-08-07 03:37:40

标签: javascript jquery jquery-plugins jquery-validate

昨天我发布了this question已经回答,但这会导致另一个问题。

我使用jquery验证插件获得以下代码:

       //array of success messages and randomly select one 
   var messages = ["Good!", "Great!", "Awesome!", "Super!", "Nice!","Yay!", "Success!", "Ok!", "Perfect!","Sweet!" ];
function successMessage(label) {
return messages[Math.floor(Math.random() * messages.length)];
}

然后我的验证码成功

...success: function(label) {
                if(!$(label).hasClass("valid")){
          label.addClass("valid").text(successMessage());
            }
       }...

正在发生的事情是每次表单生效时(在keyup或foucus上)它都会重新生成成功消息。我想,因为我正在添加类“有效”,逻辑步骤将是检查标签是否具有“有效”类,因此它不添加消息,因为它已经有一个。然而,这不起作用。任何其他想法都会很棒。

编辑:经过进一步的研究和思考。我很确定问题是每次验证表单时都会删除并添加“有效”类(在keyup,submit等上)我觉得最简单的办法就是选择标签的值并查看结果是否与数组匹配,如果是,则不要做任何其他事情添加成功消息。我错了。我也不认为我第一次把这个问题说得最好。在用户输入时更改验证消息看起来很愚蠢。

编辑2 在澄清和示例代码的许多建议之后,如果您输入一个字段直到您收到成功消息,我发布此链接http://jsfiddle.net/Ye3Ls/20/然后继续输入您将看到问题是什么我正在使用找到的验证插件here感谢您的所有患者,因为我排除了如何使其工作。我想我可能需要使用像in_array或has_value()

这样的东西

3 个答案:

答案 0 :(得分:1)

不需要标签作为successMessage的参数。

function successMessage() {
    return messages[Math.floor(Math.random() * messages.length)];
}

我相信如果label已经是一个jQuery对象,那么:$(label)将创建一个附加到jQuery的新标签jQuery对象。试试这个:

if(!label.hasClass("valid")){
    label.addClass("valid").text(successMessage());
}

或者

if(label.not(".valid")){
    label.addClass("valid").text(successMessage());
}

甚至更好:

label.not(".valid").addClass("valid").text(successMessage());
在评论中提出问题之后

[编辑]

if(label.text() === ''){
    label.not(".valid").addClass("valid").text(successMessage());
}
else {
    label.addClass("valid");
}

我假设您需要将valid类添加到label。如果不这样做,则删除else语句。

我还假设label中文字的唯一方法是通过successMessage。因此,您无需向label添加任何文字。它将保持不变。

另外,如果插件正在更改HTML元素的类,那么这是代码的严重副作用,我个人不会忍受。

现在可能发生的更合理的事情是你在提交后重新加载你的内容。如果确实如此,那么在提交之前对DOM所做的所有jQuery操作都将丢失,因为要重新加载新内容。

将来添加实际插件的链接和更完整的代码将非常重要。 @Nick Craver使用jsfiddle.net,我使用jsbin.com发布示例代码。这可以是我们所有部件上的协作努力,以便能够重现和解决问题。

[编辑1A] Here it is

问题是标签不止一次被创建。我认为这个插件不太容易使用。

我必须更改错误放置和成功逻辑。

    errorPlacement: function(label, element) {
    // position error label after generated textarea
    var name = element.attr('name');
    if ($('#' + name + '_label').length === 0) {

        label.attr('id', name + '_label');

        label.insertAfter(element);

        if (element.is("textarea")) {
            label.css({'padding-left': '105px'})
        }
    }
},

success: function(label) {
    var name = label.attr('for');
    $('#' + name + '_label').not('.valid').removeClass('error').addClass('valid').text(successMessage());
}

答案 1 :(得分:0)

看起来你的意思是说:

$(label).addClass("valid").text(successMessage());

而不是:

label.addClass("valid").text(successMessage());

答案 2 :(得分:0)

如果label是变量,而label.addClass(“valid”)工作正常,为什么不验证使用:

如果(!((标签).hasClass( “有效”))){

而不是  如果(!$(标签).hasClass( “有效”)){