昨天我发布了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()
这样的东西答案 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( “有效”)){