javascript - 尝试通过 Javascript 验证表单,但代码无法正常工作
问题描述
我有一个简单的 HTML 表单,需要在提交之前通过 Javascript 进行自定义验证。但是,尽管遵循了我教科书中的代码,但我的表单提交时没有验证。
我是高级 Web 标记课程的平面设计学生(不要被名称所迷惑,它本质上是 Javascript 101)。这是我第一次使用 Javascript,我们使用 Javascript: The Web Warrior 6th Edition 作为我们的教科书。如果有一个简单的解决方案,我提前道歉,但就像我说的,我对 Javascript 非常陌生。
我们的任务是为我们的网站创建一个表单,然后使用 Javascript 阻止表单提交并验证所有输入。如果输入有效,则表单按应有的方式提交。如果不是,则假设通过突出显示正确的字段并通过错误消息来指示哪些字段无效。
我使用教科书章节的工作文件作为我的代码的基础。但是,它不起作用。我不确定它是否没有加载 Javascript 或什么。我已经验证了我的所有代码(显然一切都很好)并联系了我的教授寻求帮助,但我还没有收到回复(作业是 4 月 26 日到期的,我已经提交了,但我想知道发生了什么错误的)。
我很幸运能够使用 try/catch/finally 语句验证表单,但根据课程,这不是我应该在这里做的。我已经尝试插入其他东西并尝试各种对我来说有一点意义的修复(有些没有)。
"use strict"; // interpret document contents in JavaScript strict mode
/* global variable */
var formValidity = true;
/* validate required fields */
function validateRequired() {
var inputElements = document.querySelectorAll("input[required]"); //
selects everything with input and required
var errorDiv = document.getElementById("errorMessage");
var contactBoxes = document.getElementsByName("contact");
var fieldsetValidity = true;
var elementCount = inputElements.length;
var currentElement;
try {
for (var i = 0; i < elementCount; i++) { // loop statement to check
each field
// this validates all required input elements in fieldset
currentElement = inputElements[i];
if (currentElement.value === "") {
currentElement.style.background = "rgb(255,233,233)"; // changes
input to pink if error
fieldsetValidity = false;
} else {
currentElement.style.background = "white";
}
}
if (!contactBoxes[0].checked && !contactBoxes[1].checked) {
// verify that a crust is selected
contactBoxes[0].style.outline = "1px solid red";
contactBoxes[1].style.outline = "1px solid red";
fieldsetValidity = false;
} else {
contactBoxes[0].style.outline = "";
contactBoxes[1].style.outline = "";
}
if (fieldsetValidity === false) { // this is the error shown in the
div
throw "Please complete the indicated field(s) so we may
provide better service.";
} else {
errorDiv.style.display = "none";
errorDiv.innerHTML = "";
}
}
catch(msg) { // this throws the error if there are any
errorDiv.style.display = "block";
errorDiv.innerHTML = msg;
formValidity = false;
}
}
function validateNumbers() { // this makes sure the phone number field
allows
only numbers
var pNumNot;
var pNum = document.getElementById("phoneinput");
var numErrMsg = document.getElementById("errorNumber");
try {
if (isNaN(pNum.value) || pNum.value === "") {
pNumNot = true;
} else { // phone input value is a number
pNum.style.background = "";
numErrMsg.style.display = "none";
}
if (pNumNot) {
throw "Please use numbers only.";
}
}
catch(msg) {
if (pNumNot) { // phone input is not a number
pNum.style.background = "rgb(255,233,233)";
numErrMsg.style.display = "block";
numErrMsg.innerHTML = msg; // then this message will display
}
formValidity = false;
}
}
/* validate form */
function validateForm(evt) {
if (evt.preventDefault) {
evt.preventDefault(); // prevent form from submitting
} else {
evt.returnValue = false; // prevent form from submitting in IE8
}
formValidity = true; // reset value for revalidation
validateRequired();
validateNumbers();
if (formValidity === true) {
document.getElementById("errorMessage").innerHTML = "";
document.getElementById("errorMessage").style.display = "none";
document.getElementsByTagName("form")[0].submit();
} else {
document.getElementById("errorMessage").innerHTML = "Please
complete
the indicated field(s) so we may provide better service.";
document.getElementById("errorMessage").style.display = "block";
}
}
/* create event listeners */
function createEventListeners() {
var orderForm = document.getElementsByTagName("form")[0];
if (orderForm.addEventListener) {
orderForm.addEventListener("submit", validateForm, false);
} else if (orderForm.attachEvent) {
orderForm.attachEvent("onsubmit", validateForm);
}
}
/* run initial form configuration functions */
function setUpPage() {
createEventListeners();
}
/* run setup functions when page finishes loading */
if (window.addEventListener) {
window.addEventListener("load", setUpPage, false);
} else if (window.attachEvent) {
window.attachEvent("onload", setUpPage);
}
如果需要,我可以发布我的 HTML 代码。该表单应该将空白的输入字段变为粉红色并显示错误消息。此外,电话号码输入字段应该只允许数字。如果一切都有效,它应该只提交并加载一个感谢用户的新页面。任何帮助是极大的赞赏!!!!
解决方案
您的表单在未经验证的情况下继续提交的原因是因为您没有event.preventDefault()
在处理提交事件的侦听器中调用。另外,由于设置了 required 属性,因此您无需检查空字符串的输入值。
我建议您阅读 eloquent JavaScript 以更好地处理事件侦听器。您可以在 Mozilla 开发者网络 (MDN) 上阅读表单验证。
推荐阅读
- intellij-idea - 如何在 IntelliJ 中记录只读 Java 代码
- c# - 模型可以/应该包含仅用于单元测试的属性/变量吗?
- c# - 使用 .NET 进行 Redis 优化,以及如何从哈希中存储和获取元素的具体示例
- python - 在 Matplotlib 中使用子图时如何控制颜色条位置
- css - 单击导航菜单时如何激活状态?
- mysql - 在 where 子句中使用参数的超集 sql 查询编辑器
- python - 当我绘制超过 2 个值时,为什么 Timer 会破坏我的数据?
- sql - 在 sql server 2016 中创建内存表时的桶计数帮助
- azure - 按每个事件组的时间戳显示第一个条目
- python - 将字符串 numpy.ndarray 转换为浮点数 numpy.ndarray