摘要:在本教程中,您将学习有关 JavaScript 表单 API 的知识:访问表单、获取元素的值、验证表单数据以及提交表单。
表单基础知识
要在 HTML 中创建表单,可以使用<form>
元素
<form action="/signup" method="post" id="signup">
</form>
Code language: HTML, XML (xml)
<form>
元素有两个重要的属性:action
和method
。
action
属性指定将处理表单提交的 URL。在此示例中,操作是/signup
URL。method
属性指定用于提交表单的 HTTP 方法。通常,方法是post
或get
。
通常,当您想从服务器检索数据时使用get
方法,而当您想更改服务器上的数据时使用post
方法。
JavaScript 使用HTMLFormElement
对象来表示表单。HTMLFormElement
具有以下与 HTML 属性相对应的属性
action
- 是处理表单数据的 URL。它等效于<form>
元素的action
属性。method
- 是 HTTP 方法,它等效于<form>
元素的method
属性。
HTMLFormElement
元素还提供了以下有用的方法
submit()
- 提交表单。reset()
- 重置表单。
引用表单
要引用<form>
元素,可以使用 DOM 选择方法,例如getElementById()
const form = document.getElementById('subscribe');
Code language: JavaScript (javascript)
HTML 文档可以包含多个表单。document.forms
属性返回文档上表单的集合(HTMLFormControlsCollection
)
document.forms
Code language: JavaScript (javascript)
要引用表单,请使用索引。例如,以下语句返回 HTML 文档的第一个表单
document.forms[0]
Code language: CSS (css)
提交表单
通常,表单有一个提交按钮。单击它时,浏览器会将表单数据发送到服务器。要创建提交按钮,请使用<input>
或<button>
元素,类型为submit
<input type="submit" value="Subscribe">
Code language: HTML, XML (xml)
或者
<button type="submit">Subscribe</button>
Code language: HTML, XML (xml)
如果提交按钮具有焦点并且您按下Enter
键,浏览器也会提交表单数据。
提交表单时,submit
事件将在请求发送到服务器之前触发。这使您有机会验证表单数据。如果表单数据无效,您可以停止提交表单。
要将事件侦听器附加到submit
事件,请使用表单元素的addEventListener()
方法,如下所示
const form = document.getElementById('signup');
form.addEventListener('submit', (event) => {
// handle the form data
});
Code language: JavaScript (javascript)
要阻止表单提交,请在submit
事件处理程序中调用event
对象的preventDefault()
方法,如下所示
form.addEventListener('submit', (event) => {
// stop form submission
event.preventDefault();
});
Code language: PHP (php)
通常,如果表单数据无效,您会调用event.preventDefault()
方法。要在 JavaScript 中提交表单,请调用表单对象的submit()
方法
form.submit();
Code language: CSS (css)
请注意,form.submit()
不会触发submit
事件。因此,在调用此方法之前,您应该始终验证表单。
访问表单字段
要访问表单字段,可以使用 DOM 方法,例如getElementsByName()
、getElementById()
、querySelector()
等。
此外,您还可以使用form
对象的elements
属性。form.elements
属性存储表单元素的集合。
JavaScript 允许您通过索引、ID 或名称访问元素。假设您有以下包含两个<input>
元素的注册表单
<form action="signup.html" method="post" id="signup">
<h1>Sign Up</h1>
<div class="field">
<label for="name">Name:</label>
<input type="text" id="name" name="name" placeholder="Enter your fullname" />
<small></small>
</div>
<div class="field">
<label for="email">Email:</label>
<input type="text" id="email" name="email" placeholder="Enter your email address" />
<small></small>
</div>
<button type="submit">Subscribe</button>
</form>
Code language: HTML, XML (xml)
要访问表单的元素,请先获取表单元素
const form = document.getElementById('signup');
Code language: JavaScript (javascript)
并使用索引、ID 或名称访问元素。以下访问第一个表单元素
form.elements[0]; // by index
form.elements['name']; // by name
form.elements['name']; // by id (name & id are the same in this case)
Code language: JavaScript (javascript)
以下访问第二个输入元素
form.elements[1]; // by index
form.elements['email']; // by name
form.elements['email']; // by id
Code language: JavaScript (javascript)
访问表单字段后,可以使用value
属性访问其值,例如
const form = document.getElementById('signup');
const name = form.elements['name'];
const email = form.elements['email'];
// getting the element's value
let fullName = name.value;
let emailAddress = email.value;
Code language: JavaScript (javascript)
将所有内容整合在一起:注册表单
以下说明了包含注册表单的 HTML 文档。 在此处查看实时演示。
<!DOCTYPE html>
<html lang="en">
<head>
<title>JavaScript Form Demo</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body>
<div class="container">
<form action="signup.html" method="post" id="signup">
<h1>Sign Up</h1>
<div class="field">
<label for="name">Name:</label>
<input type="text" id="name" name="name" placeholder="Enter your fullname" />
<small></small>
</div>
<div class="field">
<label for="email">Email:</label>
<input type="text" id="email" name="email" placeholder="Enter your email address" />
<small></small>
</div>
<div class="field">
<button type="submit" class="full">Subscribe</button>
</div>
</form>
</div>
<script src="js/app.js"></script>
</body>
</html>
Code language: HTML, XML (xml)
HTML 文档引用了style.css
和app.js
文件。它使用<small>
元素在<input>
元素具有无效数据的情况下显示错误消息。
在不提供任何信息的情况下提交表单将导致以下错误
使用姓名但电子邮件地址格式无效提交表单将导致以下错误
以下显示了完整的app.js
文件
// show a message with a type of the input
function showMessage(input, message, type) {
// get the small element and set the message
const msg = input.parentNode.querySelector("small");
msg.innerText = message;
// update the class for the input
input.className = type ? "success" : "error";
return type;
}
function showError(input, message) {
return showMessage(input, message, false);
}
function showSuccess(input) {
return showMessage(input, "", true);
}
function hasValue(input, message) {
if (input.value.trim() === "") {
return showError(input, message);
}
return showSuccess(input);
}
function validateEmail(input, requiredMsg, invalidMsg) {
// check if the value is not empty
if (!hasValue(input, requiredMsg)) {
return false;
}
// validate email format
const emailRegex =
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
const email = input.value.trim();
if (!emailRegex.test(email)) {
return showError(input, invalidMsg);
}
return true;
}
const form = document.querySelector("#signup");
const NAME_REQUIRED = "Please enter your name";
const EMAIL_REQUIRED = "Please enter your email";
const EMAIL_INVALID = "Please enter a correct email address format";
form.addEventListener("submit", function (event) {
// stop form submission
event.preventDefault();
// validate the form
let nameValid = hasValue(form.elements["name"], NAME_REQUIRED);
let emailValid = validateEmail(form.elements["email"], EMAIL_REQUIRED, EMAIL_INVALID);
// if valid, submit the form.
if (nameValid && emailValid) {
alert("Demo only. No form was posted.");
}
});
Code language: JavaScript (javascript)
它是如何工作的。
showMessage()
函数
showMessage()
函数接受一个输入元素、一条消息和一个类型
// show a message with a type of the input
function showMessage(input, message, type) {
// get the <small> element and set the message
const msg = input.parentNode.querySelector("small");
msg.innerText = message;
// update the class for the input
input.className = type ? "success" : "error";
return type;
}
Code language: JavaScript (javascript)
以下显示表单上的姓名输入字段
<div class="field">
<label for="name">Name:</label>
<input type="text" id="name" name="name" placeholder="Enter your fullname" />
<small></small>
</div>
Code language: HTML, XML (xml)
如果名称的值为空,则需要先获取其父级,即类为“field”的<div>
。
input.parentNode
Code language: CSS (css)
接下来,您需要选择<small>
元素
const msg = input.parentNode.querySelector("small");
Code language: JavaScript (javascript)
然后,更新消息
msg.innerText = message;
之后,我们根据类型参数的值更改输入字段的 CSS 类。如果类型为 true,则将输入的类更改为 success。否则,我们将类更改为 error。
input.className = type ? "success" : "error";
Code language: JavaScript (javascript)
最后,返回类型的 value
return type;
Code language: JavaScript (javascript)
showError()
和showSuccess()
函数
showError()
和showSuccess()
函数调用showMessage()
函数。showError()
函数始终返回false
,而showSuccess()
函数始终返回true
。此外,showSuccess()
函数将错误消息设置为空字符串。
function showError(input, message) {
return showMessage(input, message, false);
}
function showSuccess(input) {
return showMessage(input, "", true);
}
Code language: JavaScript (javascript)
hasValue()
函数
hasValue()
函数检查输入元素是否有值,并根据情况使用showError()
或showSuccess()
函数显示错误消息
function hasValue(input, message) {
if (input.value.trim() === "") {
return showError(input, message);
}
return showSuccess(input);
}
Code language: JavaScript (javascript)
validateEmail()
函数
validateEmail()
函数验证电子邮件字段是否包含有效的电子邮件地址
function validateEmail(input, requiredMsg, invalidMsg) {
// check if the value is not empty
if (!hasValue(input, requiredMsg)) {
return false;
}
// validate email format
const emailRegex =
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
const email = input.value.trim();
if (!emailRegex.test(email)) {
return showError(input, invalidMsg);
}
return true;
}
Code language: PHP (php)
validateEmail()
函数调用hasValue()
函数检查字段值是否为空。如果输入字段为空,则会显示requiredMsg
。
要验证电子邮件,它使用正则表达式。如果电子邮件无效,则validateEmail()
函数会显示invalidMsg
。
提交事件处理程序
首先,使用querySelector()
方法按 ID 选择注册表单
const form = document.querySelector("#signup");
Code language: JavaScript (javascript)
其次,定义一些常量来存储错误消息
const NAME_REQUIRED = "Please enter your name";
const EMAIL_REQUIRED = "Please enter your email";
const EMAIL_INVALID = "Please enter a correct email address format";
Code language: JavaScript (javascript)
第三,使用addEventListener()
方法添加注册表单的submit
事件侦听器
form.addEventListener("submit", function (event) {
// stop form submission
event.preventDefault();
// validate the form
let nameValid = hasValue(form.elements["name"], NAME_REQUIRED);
let emailValid = validateEmail(form.elements["email"], EMAIL_REQUIRED, EMAIL_INVALID);
// if valid, submit the form.
if (nameValid && emailValid) {
alert("Demo only. No form was posted.");
}
});
Code language: JavaScript (javascript)
在提交事件处理程序中
- 通过调用
event.preventDefault()
方法停止表单提交。 - 使用
hasValue()
和validateEmail()
函数验证姓名和电子邮件字段。 - 如果姓名和电子邮件均有效,则显示警报。在实际应用中,您需要调用
form.submit()
方法提交表单。
总结
- 使用
<form>
元素创建 HTML 表单。 - 使用 DOM 方法(例如
getElementById()
和querySelector()
)选择<form>
元素。document.forms[index]
也会通过数字索引返回表单元素。 - 使用
form.elements
访问表单元素。 - 当用户单击表单上的提交按钮时,会触发
submit
事件。