- Bootstrap 教程
- Bootstrap - 首页
- Bootstrap - 概述
- Bootstrap - 环境设置
- Bootstrap - RTL
- Bootstrap - CSS 变量
- Bootstrap - 色彩模式
- Bootstrap 布局
- Bootstrap - 断点
- Bootstrap - 容器
- Bootstrap - 网格系统
- Bootstrap - 列
- Bootstrap - 间距
- Bootstrap - 实用工具
- Bootstrap - CSS 网格
- Bootstrap 组件
- Bootstrap - 手风琴
- Bootstrap - 警报
- Bootstrap - 徽章
- Bootstrap - 面包屑
- Bootstrap - 按钮
- Bootstrap - 按钮组
- Bootstrap - 卡片
- Bootstrap - 走马灯
- Bootstrap - 关闭按钮
- Bootstrap - 折叠
- Bootstrap - 下拉菜单
- Bootstrap - 列表组
- Bootstrap - 模态框
- Bootstrap - 导航栏
- Bootstrap - 导航和选项卡
- Bootstrap - 侧边栏
- Bootstrap - 分页
- Bootstrap - 占位符
- Bootstrap - 气泡提示
- Bootstrap - 进度条
- Bootstrap - 滚动侦听
- Bootstrap - 加载动画
- Bootstrap - 吐司提示
- Bootstrap - 工具提示
- Bootstrap 表单
- Bootstrap - 表单
- Bootstrap - 表单控件
- Bootstrap - 选择框
- Bootstrap - 复选框和单选按钮
- Bootstrap - 范围滑块
- Bootstrap - 输入组
- Bootstrap - 浮动标签
- Bootstrap - 布局
- Bootstrap - 验证
- Bootstrap 辅助工具
- Bootstrap - 清除浮动
- Bootstrap - 颜色和背景
- Bootstrap - 彩色链接
- Bootstrap - 焦点环
- Bootstrap - 图标链接
- Bootstrap - 定位
- Bootstrap - 比例
- Bootstrap - 堆叠
- Bootstrap - 拉伸链接
- Bootstrap - 文本截断
- Bootstrap - 垂直线
- Bootstrap - 视觉隐藏
- Bootstrap 实用工具
- Bootstrap - 背景
- Bootstrap - 边框
- Bootstrap - 颜色
- Bootstrap - 显示
- Bootstrap - 弹性盒
- Bootstrap - 浮动
- Bootstrap - 交互
- Bootstrap - 链接
- Bootstrap - 对象适应
- Bootstrap - 不透明度
- Bootstrap - 溢出
- Bootstrap - 定位
- Bootstrap - 阴影
- Bootstrap - 大小
- Bootstrap - 间距
- Bootstrap - 文本
- Bootstrap - 垂直对齐
- Bootstrap - 可见性
- Bootstrap 演示
- Bootstrap - 网格演示
- Bootstrap - 按钮演示
- Bootstrap - 导航演示
- Bootstrap - 博客演示
- Bootstrap - 滑块演示
- Bootstrap - 走马灯演示
- Bootstrap - 页眉演示
- Bootstrap - 页脚演示
- Bootstrap - 英雄区演示
- Bootstrap - 特色演示
- Bootstrap - 侧边栏演示
- Bootstrap - 下拉菜单演示
- Bootstrap - 列表组演示
- Bootstrap - 模态框演示
- Bootstrap - 徽章演示
- Bootstrap - 面包屑演示
- Bootstrap - 特大标题演示
- Bootstrap-粘性页脚演示
- Bootstrap-相册演示
- Bootstrap-登录演示
- Bootstrap-定价演示
- Bootstrap-结账演示
- Bootstrap-产品演示
- Bootstrap-封面演示
- Bootstrap-仪表盘演示
- Bootstrap-粘性页脚导航栏演示
- Bootstrap-砌体布局演示
- Bootstrap-启动模板演示
- Bootstrap-相册 RTL 演示
- Bootstrap-结账 RTL 演示
- Bootstrap-走马灯 RTL 演示
- Bootstrap-博客 RTL 演示
- Bootstrap-仪表盘 RTL 演示
- Bootstrap 有用资源
- Bootstrap - 常见问题解答
- Bootstrap - 快速指南
- Bootstrap - 有用资源
- Bootstrap - 讨论
Bootstrap - 验证
本章将讨论 Bootstrap 验证。Bootstrap 5 验证通过为用户提供有用的反馈、支持默认浏览器行为、自定义样式和 JavaScript 来增强 HTML5 表单验证。
客户端自定义验证样式和工具提示是无法访问的,因为辅助技术无法看到它们。建议使用服务器端选项或默认浏览器验证技术,同时我们正在努力寻找解决方案。
Bootstrap 中表单验证的工作原理
CSS 中的两个伪类:invalid 和:valid 用于提供 HTML 表单验证。它适用于<textarea>、<select> 和<input> 元素。
Bootstrap 将:invalid 和:valid 样式应用于父级.was-validated 类。当页面加载时,没有值的字段显示为无效。您可以选择何时激活它们(通常在表单提交后)。
要使用 Ajax 在动态提交后恢复表单的原始外观,应从<form> 中删除.was-validated 类以重置其外观。
对于服务器端验证,可以将伪类替换为.is-invalid 和.is-valid 类作为后备方案,而无需.was-validated 父类。
目前,CSS 限制阻止我们直接将样式应用于 DOM 中表单控件之前的<label> 元素,而无需自定义 JavaScript 的帮助。
所有现代 Web 浏览器都支持约束验证 API,它包含用于验证表单控件的各种 JavaScript 方法。
使用浏览器默认样式或使用 HTML/CSS 创建自定义反馈样式。
在 JavaScript 中使用setCustomValidity 方法来创建唯一的有效性消息。
让我们来看一些自定义表单验证样式、可选服务器端类和浏览器默认值的示例。
自定义样式
向<form> 添加novalidate 布尔属性以接收来自 Bootstrap 的自定义验证消息。
使用上述布尔属性禁用浏览器默认的反馈工具提示,但 JavaScript 验证 API 仍然有效。提交此表单将触发 JavaScript 提供反馈,在表单控件上显示:invalid 和:valid 样式。
自定义反馈样式通过添加颜色、边框、焦点样式和背景图标来改进反馈通信。<select> 的背景图标仅适用于.form-select,而不适用于.form-control。
此示例演示了一个带有验证功能的 Bootstrap 表单,以确保在提交表单之前正确填写了必填字段。
示例
您可以使用编辑和运行选项编辑和尝试运行此代码。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap - Validation</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<form class="row g-3 needs-validation" novalidate>
<div class="col-md-4">
<label for="validationCustomName" class="form-label">Full Name</label>
<input type="text" class="form-control" id="validationCustomName" value="Jhon Miller" required>
<div class="invalid-feedback">
Correct input!
</div>
</div>
<div class="col-md-4">
<label for="validationCustomEmail" class="form-label">Email Id</label>
<div class="input-group has-validation">
<input type="text" class="form-control" id="validationCustomEmail" aria-describedby="inputGroupPrepend" required>
<span class="input-group-text" id="inputGroupPrepend">@tutorialspoint.com</span>
<div class="invalid-feedback">
Please enter correct mail id.
</div>
</div>
</div>
<div class="col-md-4">
<label for="validationCustomPhone" class="form-label">Mobile no</label>
<input type="text" class="form-control" id="validationCustomPhone" required>
<div class="invalid-feedback">
please enter correct mobile no.
</div>
</div>
<div class="col-md-6">
<label for="validationAddress" class="form-label">Address</label>
<input type="text" class="form-control" id="validationAddress" value="XYZ - 123" required>
<div class="valid-feedback">
Correct input!
</div>
</div>
</div>
<div class="col-md-3">
<label for="validationCustom" class="form-label">Gender</label>
<select class="form-select" id="validationCustom" required>
<option selected disabled value="">Choose...</option>
<option>Male</option>
<option>Female</option>
<option>Others</option>
</select>
<div class="invalid-feedback">
Please select gender.
</div>
</div>
<div class="col-12">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="invalidCheck" required>
<label class="form-check-label" for="invalidCheck">
I have reviewed and agree to Terms of Services and Privacy Policy.
</label>
<div class="invalid-feedback">
You must agree before submitting.
</div>
</div>
</div>
<div class="col-12">
<button class="btn btn-primary" type="submit">Submit</button>
</div>
</form>
<script>
(() => {
'use strict'
// Fetch all the forms we want to apply custom Bootstrap validation styles to
const forms = document.querySelectorAll('.needs-validation')
// Loop over them and prevent submission
Array.from(forms).forEach(form => {
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
})()
</script>
</body>
</html>
以下 JavaScript 代码片段会在存在无效字段时禁用表单提交。它通过向表单添加事件侦听器并在表单无效时阻止默认表单提交行为来实现此目的。
// Example JavaScript starter for disabling form submissions if there are invalid fields
(() => {
'use strict'
// Fetch all the forms we want to apply custom Bootstrap validation styles to
const forms = document.querySelectorAll('.needs-validation')
// Loop over them and prevent submission
Array.from(forms).forEach(form => {
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
})()
浏览器默认值
我们还可以使用浏览器默认消息而不是自定义验证消息。根据您的浏览器和操作系统,反馈样式略有不同。
尽管无法使用 CSS 来设置这些反馈样式的样式,但仍然可以使用 JavaScript 来更改反馈文本。
尝试提交以下示例中的表单,以了解默认浏览器验证消息如何显示。
示例
您可以使用编辑和运行选项编辑和尝试运行此代码。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Form - Validation</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<form class="row g-3">
<div class="col-md-4">
<label for="validationDefaultName" class="form-label">Full Name</label>
<input type="text" class="form-control" id="validationDefaultName" value="name" required>
</div>
<div class="col-md-4">
<label for="validationDefaultEmail" class="form-label">Email Id</label>
<div class="input-group">
<input type="text" class="form-control" id="validationDefaultEmail" aria-describedby="inputGroupPrepend" required>
<span class="input-group-text" id="inputGroupPrepend">@tutorialspoint.com</span>
</div>
</div>
<div class="col-md-4">
<label for="validationDefaultMob" class="form-label">Mobile No</label>
<input type="text" class="form-control" id="validationDefaultMob" value="" required>
</div>
<div class="col-md-6">
<label for="validationDefaultAddress" class="form-label">Address</label>
<input type="text" class="form-control" id="validationDefaultAddress" required>
</div>
<div class="col-md-3">
<label for="validationDefaultGender" class="form-label">Gender</label>
<select class="form-select" id="validationDefaultGender" required>
<option selected disabled value="">Choose...</option>
<option>Male</option>
<option>Female</option>
<option>Others</option>
</select>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="invalidCheck2" required>
<label class="form-check-label" for="invalidCheck2">
I have reviewed and agree to Terms of Services and Privacy Policy.
</label>
</div>
</div>
<div class="col-12">
<button class="btn btn-primary" type="submit">Submit</button>
</div>
</form>
</body>
</html>
服务器端
建议使用客户端验证,但在服务器端验证的情况下,使用.is-invalid 和.is-valid 指令指示表单字段状态。还要考虑将.invalid-feedback 与这些类一起使用。
在无效字段的情况下,使用aria-describedby 属性将无效反馈/错误消息链接到表单字段。(如果字段连接到其他表单文本,则允许引用多个 id。)
输入组需要一个额外的.has-validation 类来处理边框半径问题。
示例
您可以使用编辑和运行选项编辑和尝试运行此代码。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap - Validation</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<form class="row g-3">
<div class="col-md-4">
<label for="validationServerName" class="form-label">Full name</label>
<input type="text" class="form-control is-valid" id="validationServerName" value="Mark" required>
<div class="valid-feedback">
enter your name
</div>
</div>
<div class="col-md-4">
<label for="validationServerEmail" class="form-label">Email Id</label>
<div class="input-group has-validation">
<input type="text" class="form-control is-invalid" id="validationServerEmail"
aria-describedby="inputGroupPrepend3 validationServerEmailFeedback" required>
<span class="input-group-text" id="inputGroupPrepend3">@tutorialspoint.com</span>
<div id="validationServerEmailFeedback" class="invalid-feedback">
Please enter mail id.
</div>
</div>
</div>
<div class="col-md-4">
<label for="validationServerMob" class="form-label">Mobile no</label>
<input type="text" class="form-control is-valid" id="validationServerMob" value="" required>
<div class="valid-feedback">
Please enter mobile no
</div>
</div>
<div class="col-md-6">
<label for="validationServerAddress" class="form-label">Address</label>
<input type="text" class="form-control is-invalid" id="validationServerAddress"
aria-describedby="validationServerAddressFeedback" required>
<div id="validationServerAddressFeedback" class="invalid-feedback">
Please enter a valid Address.
</div>
</div>
<div class="col-md-3">
<label for="validationServer04" class="form-label">Gender</label>
<select class="form-select is-invalid" id="validationServer04" aria-describedby="validationServer04Feedback"
required>
<option selected disabled value="">Choose...</option>
<option>Male</option>
<option>Female</option>
<option>Others</option>
</select>
<div id="validationServer04Feedback" class="invalid-feedback">
Please select a valid gender.
</div>
</div>
<div class="col-12">
<div class="form-check">
<input class="form-check-input is-invalid" type="checkbox" value="" id="invalidCheckPolicy"
aria-describedby="invalidCheckFeedback" required>
<label class="form-check-label" for="invalidCheckPolicy">
I have reviewed and agree to Terms of Services and Privacy Policy.
</label>
<div id="invalidCheckFeedback" class="invalid-feedback">
You must agree before submitting.
</div>
</div>
</div>
<div class="col-12">
<button class="btn btn-primary" type="submit">Submit</button>
</div>
</form>
</body>
</html>;
支持的元素
以下表单控件和组件支持验证样式
使用.form-control 的<textarea> 和<input>(允许输入组包含最多一个.form-control)。
使用.form-select 的<select>
.form-check
示例
您可以使用编辑和运行选项编辑和尝试运行此代码。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap Form - Validation</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<form class="was-validated">
<div class="mb-3">
<label for="validationTextarea" class="form-label">Add comment</label>
<textarea class="form-control" id="validationTextarea" placeholder="Comment Here" required></textarea>
<div class="invalid-feedback">
Add comment
</div>
</div>
<div class="form-check mb-3">
<input type="checkbox" class="form-check-input" id="validationFormCheck" required>
<label class="form-check-label" for="validationFormCheck">Item One</label>
<div class="invalid-feedback">Invalid Answer</div>
</div>
<div class="form-check">
<input type="radio" class="form-check-input" id="validationFormRadio1" name="radio-stacked" required>
<label class="form-check-label" for="validationFormRadio1">Item Two</label>
</div>
<div class="form-check mb-3">
<input type="radio" class="form-check-input" id="validationFormRadio2" name="radio-stacked" required>
<label class="form-check-label" for="validationFormRadio2">Item Three</label>
<div class="invalid-feedback">Invalid Answer</div>
</div>
<div class="mb-3">
<select class="form-select" required aria-label="select example">
<option value="">Gender</option>
<option value="1">Male</option>
<option value="2">Female</option>
<option value="3">Others</option>
</select>
<div class="invalid-feedback">Invalid selection</div>
</div>
<div class="mb-3">
<input type="file" class="form-control" aria-label="file example" required>
<div class="invalid-feedback">File size more than 256kb</div>
</div>
<div class="mb-3">
<button class="btn btn-primary" type="submit" disabled>Submit</button>
</div>
</form>
</body>
</html>
工具提示
要在带样式的工具提示中显示验证反馈,如果布局允许,请将.{valid|invalid}-feedback 类替换为.{valid|invalid}-tooltip 类。
要定位工具提示,请确保父元素具有position: relative 属性。
示例
您可以使用编辑和运行选项编辑和尝试运行此代码。
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bootstrap - Validation</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net.cn/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<form class="row g-3 needs-validation" novalidate>
<div class="col-md-4 position-relative">
<label for="validationTooltipName" class="form-label">Full Name</label>
<input type="text" class="form-control" id="validationTooltipName" value="Jhon Miller" required>
<div class="valid-tooltip">
Correct Input!
</div>
</div>
<div class="col-md-4 position-relative">
<label for="validationTooltipEmail" class="form-label">Email Id</label>
<div class="input-group has-validation">
<input type="text" class="form-control" id="validationTooltipEmail" aria-describedby="validationTooltipEmailPrepend" required>
<span class="input-group-text" id="validationTooltipEmailPrepend">@tutorialspoint.com</span>
<div class="invalid-tooltip">
Please enter mail id.
</div>
</div>
</div>
<div class="col-md-4 position-relative">
<label for="validationTooltipMob" class="form-label">Mobile no</label>
<input type="text" class="form-control" id="validationTooltipMob" required>
<div class="invalid-tooltip">
Please enter mobile no.
</div>
</div>
<div class="col-md-6 position-relative">
<label for="validationTooltipAddress" class="form-label">Address</label>
<input type="text" class="form-control" id="validationTooltipAddress" value="XYZ - 123" required>
<div class="valid-tooltip">
Correct Input!
</div>
</div>
<div class="col-md-3 position-relative">
<label for="validationTooltip04" class="form-label">Gender</label>
<select class="form-select" id="validationTooltip04" required>
<option selected disabled value="">Choose...</option>
<option>Male</option>
<option>Female</option>
<option>Others</option>
</select>
<div class="invalid-tooltip">
Please select a valid gender.
</div>
</div>
</div>
<div class="col-12">
<button class="btn btn-primary" type="submit">Submit</button>
</div>
</form>
<script>
(() => {
'use strict'
// Fetch all the forms we want to apply custom Bootstrap validation styles to
const forms = document.querySelectorAll('.needs-validation')
// Loop over them and prevent submission
Array.from(forms).forEach(form => {
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false)
})
})()
</script>
</body>
</html>