Jquery验证插件:无效的textarea没有错误消息
问题描述:
我有这种联系表格,使用Jquery validation plugin做一些快速的用户友好的验证之前,表单数据发送到phpmailer脚本。Jquery验证插件:无效的textarea没有错误消息
姓名和电子邮件字段按预期工作,但注释textarea不提供反馈,即使未满足“规则”中指定的参数(即required和minlength),也允许提交表单。不知道我错过了什么,并会欣赏从新鲜的眼睛看。
<form class="cForm" id="commentForm" method="post" action="sanitizeandvalidate.php">
<div id="feedback">
<span></span>
</div>
<label for="firstname">First Name</label>
<input id="firstname" name="firstname" type="text" placeholder=" . . .">
<div id="fnameError"></div>
<label for="lastname">Last Name</label>
<input id="lastname" name="lastname" type="text" placeholder=" . . .">
<div id="lnameError"></div>
<label id="lbl_email" for="email">Email</label>
<input id="email" name="email" type="email" placeholder=" . . .">
<div id="emailError"></div>
<p><label for="comment">Comment</label></p>
<textarea id="comment" name="comment" rows=11 cols=60 placeholder=" Tell us whats on your mind."></textarea>
<div id="commentError"></div>
<input class="submit" type="submit" value="Submit">
<span id="loading"></span>
</form>
$.validator.addMethod("lettersonly", function(value, element) {
return this.optional(element) || /^[a-z\-.,()'"\s]+$/i.test(value);
});
$(function() {
//form submit success/failure message
var feedback = $('#feedback'),
feedbackDiv = feedback.find('span'),
//ID of loading.svg
loading = $('#loading'),
//ID of Div that contains the form
tailbar = $('#tailbar');
function showFeedback(message, attr) {
feedbackDiv.text(message),
feedbackDiv.attr('class', attr);
feedbackDiv.delay(3000).fadeOut('slow');
feedbackDiv.delay(3005).removeAttr('style');
}
$("#commentForm").validate({
debug: true,
rules: {
firstname: {
required: true,
lettersonly: true
},
lastname: {
required: true,
lettersonly: true
},
email: {
required: true,
email: true
},
comment: {
required: true,
minlength: 10
}
},
messages: {
firstname: {
required: ' First name is required',
lettersonly: 'Letters or punctuation only please'
},
lastname: {
required: ' Last name is required',
lettersonly: ' Letters or punctuation only please'
},
email: {
required: ' Please enter an email address',
email: ' Not a <em>valid</em> email address'
},
comment: {
required: ' A comment is required',
minlength: ' Your comment must excede 10 characters'
},
},
errorPlacement: function(error, element) {
if (element.attr('name') == 'comment')
error.insertAfter('#commentError');
else if (element.attr('name') == 'email')
error.insertAfter('#emailError');
else if (element.attr('name') == 'lastname')
error.insertAfter('#lnameError');
else if (element.attr('name') == 'firstname')
error.insertAfter('#fnameError');
},
submitHandler: function(form) {
var options = {
beforeSubmit: function() {
loading.show();
},
success: function() {
showFeedback('Thank you for your message, we will get back to you as soon as possible.', 'success');
form.reset();
loading.hide();
tailbar.delay(4000).slideToggle('slow');
},
error: function() {
showFeedback('Sorry there was an unexpected error and your message was not sent. Please try again later.', 'failure');
loading.hide();
form.reset();
}
};
$(form).ajaxSubmit(options);
},
invalidHandler: function() {
showFeedback('One or more of the fields are invalid.', 'failure');
}
});
});
答
道歉,我已经意识到我的错误。这段代码能够正常工作(我必须在jsfiddle上错过了一些没有看到它的东西)。我的问题在于我在我的项目中将我与它的父项分开。
答
您不必为文本区域验证方式不同。我猜错误文本确实存在于DOM中。首先,检查它是否存在于DOM中。它可能隐藏在提交按钮的位置。这与您提供的代码完全相同。尝试在这里运行它。它将按预期
// Code goes here
$.validator.addMethod("lettersonly", function(value, element) {
return this.optional(element) || /^[a-z\-.,()'"\s]+$/i.test(value);
});
$(function() {
//form submit success/failure message
var feedback = $('#feedback'),
feedbackDiv = feedback.find('span'),
//ID of loading.svg
loading = $('#loading'),
//ID of Div that contains the form
tailbar = $('#tailbar');
function showFeedback(message, attr) {
feedbackDiv.text(message),
feedbackDiv.attr('class', attr);
feedbackDiv.delay(3000).fadeOut('slow');
feedbackDiv.delay(3005).removeAttr('style');
}
$("#commentForm").validate({
debug: true,
rules: {
firstname: {
required: true,
lettersonly: true
},
lastname: {
required: true,
lettersonly: true
},
email: {
required: true,
email: true
},
comment: {
required: true,
minlength: 10
}
},
messages: {
firstname: {
required: ' First name is required',
lettersonly: 'Letters or punctuation only please'
},
lastname: {
required: ' Last name is required',
lettersonly: ' Letters or punctuation only please'
},
email: {
required: ' Please enter an email address',
email: ' Not a <em>valid</em> email address'
},
comment: {
required: ' A comment is required',
minlength: ' Your comment must excede 10 characters'
},
},
errorPlacement: function(error, element) {
if (element.attr('name') == 'comment')
error.insertAfter('#commentError');
else if (element.attr('name') == 'email')
error.insertAfter('#emailError');
else if (element.attr('name') == 'lastname')
error.insertAfter('#lnameError');
else if (element.attr('name') == 'firstname')
error.insertAfter('#fnameError');
},
submitHandler: function(form) {
var options = {
beforeSubmit: function() {
loading.show();
},
success: function() {
showFeedback('Thank you for your message, we will get back to you as soon as possible.', 'success');
form.reset();
loading.hide();
tailbar.delay(4000).slideToggle('slow');
},
error: function() {
showFeedback('Sorry there was an unexpected error and your message was not sent. Please try again later.', 'failure');
loading.hide();
form.reset();
}
};
$(form).ajaxSubmit(options);
},
invalidHandler: function() {
showFeedback('One or more of the fields are invalid.', 'failure');
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.16.0/jquery.validate.min.js"></script>
<body>
<form class="cForm" id="commentForm" method="post" action="sanitizeandvalidate.php">
<div id="feedback">
<span></span>
</div>
<label for="firstname">First Name</label>
<input id="firstname" name="firstname" placeholder=" . . ." type="text" />
<div id="fnameError"></div>
<label for="lastname">Last Name</label>
<input id="lastname" name="lastname" placeholder=" . . ." type="text" />
<div id="lnameError"></div>
<label id="lbl_email" for="email">Email</label>
<input id="email" name="email" placeholder=" . . ." type="email" />
<div id="emailError"></div>
<p>
<label for="comment">Comment</label>
</p>
<textarea id="comment" name="comment" rows="11" cols="60" placeholder=" Tell us whats on your mind."></textarea>
<div id="commentError"></div>
<input class="submit" value="Submit" type="submit" />
<span id="loading"></span>
</form>
</body>
我唯一的想法是,我必须做一些不同的事情来验证