[英]Simple form validation isn't working properly
因此,我试图实现一个简单的表单验证脚本以在Web服务器上运行,但我无法弄清为什么它不起作用。
通过运行代码的一些测试,似乎可以很好地完成注释部分的验证,但是电子邮件和主题部分没有得到正确验证,即使输入值在技术上应满足条件,也继续显示错误消息。
使用Javascript:
function validateForm(){
var validEmail, validSubject, validComment = true;
var validDocument = true;
var emailEntry =document.forms["contact_form"]["email"].value;
var pattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
if (!pattern.test(emailEntry)) {
//Not a valid email
validEmail = false;
}
var subjectEntry = document.forms["contact_form"]["subject"].value;
if(subjectEntry.length < 6) {
//Not a valid subject
validSubject = false;
}
var commentsEntry = document.forms["contact_form"]["comments"].value;
if(commentsEntry.length < 50) {
//Not a valid comment
validComment = false;
}
var err1 = document.getElementById("email_error");
var err2 = document.getElementById("subject_error");
var err3 = document.getElementById("comment_error");
if(!validEmail) {
//make error messages visible
validDocument = false;
err1.style.visibility = "visible";
} else {
err1.style.visibility = "hidden";
}
if(!validSubject) {
//make error messages visible
validDocument = false;
err2.style.visibility = "visible";
} else {
err2.style.visibility = "hidden";
}
if(!validComment) {
//make error messages visible
validDocument = false;
err3.style.visibility = "visible";
} else {
err3.style.visibility = "hidden";
}
if(!validDocument) {
var container = document.getElementById("errors");
container.style.visibility = "visible";
return false;
} else {
return true;
}}
HTML:
<div id="contact_fields">
<form name="contact_form" onSubmit="return validateForm()" method="post" action="form_mailer.php">
<font class="form_headers" face="Arial, Helvetica, sans-serif" size="4" color="#FFF">
Your e-mail address :
</font>
<br><input type="text" name="email" id="email" value="" size="40"
style="height:10%;font-size:1.3vw;">
<br><br><br><br>
<font class="form_headers" face="Arial, Helvetica, sans-serif" size="4" color="#FFF">
Subject :
</font>
<br><input type="text" name="subject" id="subject" value="" size="40"
style="height:10%;font-size:1.3vw;">
<br><br><br><br>
<font class="form_headers" face="Arial, Helvetica, sans-serif" size="4" color="#FFF">
Message :
</font>
<br><textarea name="comments" id="comments" rows="8" cols="40"
style="font-size:1.3vw;"></textarea>
<br>
<font face="Arial, Helvetica, sans-serif" size="2" color="#FFF">
• You must fill in all fields in order to submit.
</font>
<br>
<input type="submit" name="Submit" value="submit" style="float:right;">
</form>
</div>
<div id="errors" style="visibility:hidden">
<p><font id="email_error" face="Arial, Helvetica, sans-serif" style="visibility:hidden" color="#FF0000">
*Enter a valid e-mail</font></p>
<p><font id="subject_error" face="Arial, Helvetica, sans-serif" style="visibility:hidden" color="#FF0000">*Subject must be at least 6 characters</font></p>
<p><font id="comment_error" face="Arial, Helvetica, sans-serif" style="visibility:hidden" color="#FF0000">*Message must be at least 50 characters</font></p>
</div>
编辑1:原谅html中真正令人讨厌的break标记,这有点仓促。
编辑2:将电子邮件验证更改为RegEx,但无济于事。
以下是通用验证器的代码
function validator(/*fn, args */) {
var predicate = arguments[0];
var args = Array.prototype.splice.call(arguments, 1);
return function() {
return (predicate.apply(null, arguments) == true);
};
};
使用此功能,您可以创建更多特定的验证器,以后可以重复使用。 无论如何,它都不是完整的验证器,但这只是一个开始。
有了通用验证器后,就可以开始编码特定的验证器了。 在这种情况下,我们有两个验证器。 是电子邮件的值,并且是大于一定长度的字符串。 不用担心一封电子邮件,我只是从regex库中删除了它。 您可以使用适合您需求的一种。
var isEmail = validator(function(email) {
return /^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$/.test(email);
});
var isStringLengthGreaterThan = validator(function(value, length) {
return (value.length > length);
});
让我们创建一个通用的表单验证器。 因此,我们将从验证单个字段开始。 开始了。 此代码将接受参数,并假定前三个是formId,fieldId和验证器。 所有其他参数都被视为验证器的参数。
function isFieldValid(formId, domId, validatorFn) {
var args = Array.prototype.splice.call(arguments, 3);
args.unshift( document.forms[formId][domId].value );
return validatorFn.apply(null, args);
};
我在这里很懒惰(现在是午餐时间),但是您现在可以将所有内容放入集合中并遍历它们。 您可以创建一个名为doWhen的函数,并使用语法doWhen(!isFieldValid(...), printErrorMessage(...))
,但我将留给您自己解决。
function validateForm(){
var validFields = [
isFieldValid('contact_form', 'email', isEmail),
isFieldValid('contact_form', 'subject', isStringLengthGreaterThan, 6),
isFieldValid('contact_form', 'comments', isStringLengthGreaterThan, 50)
];
var errorDomId = ["email_error", "subject_error", "comment_error"];
validFields.forEach(function(isValid, index) {
if ( isValid == false) {
document
.getElementById(errorDomId[index])
.style
.visibility = 'visible';
};
});
if (validFields.indexOf(false) > -1) {
var container = document.getElementById("errors");
container.style.visibility = "visible";
}
return (validFields.indexOf(false) == -1);
}
关键是将数据放入集合中,使您的函数保持简单,并在数据集合中循环以执行针对它们的操作和/或功能。 请注意,forEach方法在IE <9中不起作用。如果需要,可以将其替换为常规的for循环。 但是,出于可读性原因,我使用它。 祝您好运,编码愉快!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.