首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >HTML5 表单验证 API

HTML5 表单验证 API

作者头像
空白诗
发布于 2024-12-13 00:39:50
发布于 2024-12-13 00:39:50
9700
举报

引言

HTML5 表单验证 API 提供了一种原生的、简单而强大的方式来验证表单输入,无需依赖 JavaScript 或其他库。这个 API 不仅提高了开发效率,还能改善用户体验和页面性能。

基本概念

HTML5 表单验证主要通过以下方式实现:

  1. HTML 属性:使用新的 HTML 属性来指定验证规则。
  2. CSS 伪类:使用新的 CSS 伪类来为不同状态的表单元素应用样式。
  3. JavaScript API:使用新的 JavaScript API 来进行编程控制和自定义验证。

使用 HTML5 表单验证

1. 必填字段

使用 required 属性指定必填字段:

代码语言:javascript
AI代码解释
复制
<input type="text" required>
2. 模式匹配

使用 pattern 属性指定正则表达式模式:

代码语言:javascript
AI代码解释
复制
<input type="text" pattern="[A-Za-z]{3}" title="三个字母">
3. 长度限制

使用 minlengthmaxlength 属性限制输入长度:

代码语言:javascript
AI代码解释
复制
<input type="text" minlength="3" maxlength="8">
4. 范围限制

对于数字输入,使用 minmax 属性:

代码语言:javascript
AI代码解释
复制
<input type="number" min="0" max="100">
5. 类型验证

HTML5 引入了多种新的输入类型,它们自带验证功能:

代码语言:javascript
AI代码解释
复制
<input type="email">
<input type="url">
<input type="date">
<input type="time">
<input type="number">
<input type="tel">

CSS 伪类

HTML5 引入了几个新的 CSS 伪类,用于根据验证状态设置样式:

代码语言:javascript
AI代码解释
复制
input:valid {
    border-color: green;
}

input:invalid {
    border-color: red;
}

input:required {
    background-color: #ffeeee;
}

input:optional {
    background-color: #eeeeff;
}

JavaScript API

HTML5 提供了一些 JavaScript API 来控制和自定义表单验证:

1. 检查表单有效性
代码语言:javascript
AI代码解释
复制
const form = document.querySelector('form');
console.log(form.checkValidity()); // 返回 true 如果所有控件都有效
2. 检查单个表单控件有效性
代码语言:javascript
AI代码解释
复制
const email = document.getElementById('email');
console.log(email.checkValidity()); // 返回 true 如果该控件有效
3. 设置自定义错误
代码语言:javascript
AI代码解释
复制
const username = document.getElementById('username');
username.setCustomValidity('用户名已被使用');
4. 验证消息

可以使用 validationMessage 属性获取验证消息:

代码语言:javascript
AI代码解释
复制
const password = document.getElementById('password');
console.log(password.validationMessage);
5. 验证状态属性

每个表单元素都有以下布尔属性:

  • validity.valueMissing
  • validity.typeMismatch
  • validity.patternMismatch
  • validity.tooLong
  • validity.tooShort
  • validity.rangeUnderflow
  • validity.rangeOverflow
  • validity.stepMismatch
  • validity.valid

例如:

代码语言:javascript
AI代码解释
复制
const email = document.getElementById('email');
if (email.validity.typeMismatch) {
    console.log('请输入有效的邮箱地址');
}

高级特性和技巧

1. 自定义验证

使用 setCustomValidity() 方法可以实现复杂的自定义验证:

代码语言:javascript
AI代码解释
复制
const password = document.getElementById('password');
const confirmPassword = document.getElementById('confirm-password');

confirmPassword.addEventListener('input', function() {
    if (this.value !== password.value) {
        this.setCustomValidity('密码不匹配');
    } else {
        this.setCustomValidity('');
    }
});
2. 禁用验证

在某些情况下,你可能想禁用表单验证:

代码语言:javascript
AI代码解释
复制
<form novalidate>
    <!-- 表单内容 -->
</form>

或者在提交时使用 JavaScript 禁用验证:

代码语言:javascript
AI代码解释
复制
form.addEventListener('submit', function(event) {
    event.preventDefault();
    if (this.checkValidity()) {
        // 手动提交表单
        this.submit();
    }
}, false);
3. 自定义样式

结合 CSS 伪类和属性选择器,可以创建复杂的自定义样式:

代码语言:javascript
AI代码解释
复制
input:invalid[focused="true"] {
    border-color: red;
}

input:invalid[focused="true"] ~ span {
    display: block;
}

配合 JavaScript:

代码语言:javascript
AI代码解释
复制
const inputs = document.querySelectorAll('input');

inputs.forEach(input => {
    input.addEventListener('blur', () => {
        input.setAttribute('focused', 'true');
    });
});

实际应用示例:注册表单

下面是一个使用 HTML5 表单验证 API 的注册表单示例:

代码语言:javascript
AI代码解释
复制
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>注册表单</title>
    <style>
        form {
            max-width: 300px;
            margin: 0 auto;
        }
        input {
            display: block;
            width: 100%;
            margin-bottom: 10px;
            padding: 5px;
        }
        input:invalid {
            border-color: red;
        }
        input:valid {
            border-color: green;
        }
        .error {
            color: red;
            font-size: 0.8em;
            display: none;
        }
        input:invalid[focused="true"] + .error {
            display: block;
        }
    </style>
</head>
<body>
    <form novalidate>
        <input type="text" id="username" required minlength="3" maxlength="20" pattern="[A-Za-z0-9]+" placeholder="用户名">
        <span class="error">用户名应为3-20个字符,只能包含字母和数字</span>

        <input type="email" id="email" required placeholder="邮箱">
        <span class="error">请输入有效的邮箱地址</span>

        <input type="password" id="password" required minlength="8" placeholder="密码">
        <span class="error">密码至少需要8个字符</span>

        <input type="password" id="confirm-password" required placeholder="确认密码">
        <span class="error">两次输入的密码不一致</span>

        <input type="submit" value="注册">
    </form>

    <script>
        const form = document.querySelector('form');
        const inputs = document.querySelectorAll('input');
        const password = document.getElementById('password');
        const confirmPassword = document.getElementById('confirm-password');

        inputs.forEach(input => {
            input.addEventListener('blur', () => {
                input.setAttribute('focused', 'true');
            });
        });

        confirmPassword.addEventListener('input', function() {
            if (this.value !== password.value) {
                this.setCustomValidity('密码不匹配');
            } else {
                this.setCustomValidity('');
            }
        });

        form.addEventListener('submit', function(event) {
            event.preventDefault();
            if (this.checkValidity()) {
                console.log('表单验证通过,可以提交');
                // 这里可以添加表单提交逻辑
            } else {
                console.log('表单验证失败');
            }
        });
    </script>
</body>
</html>

这个例子展示了如何:

  1. 使用 HTML5 属性进行基本验证
  2. 使用 CSS 为无效输入提供视觉反馈
  3. 使用 JavaScript 进行自定义验证(密码匹配)
  4. 处理表单提交并检查整体有效性

最佳实践

  1. 渐进增强:始终提供服务器端验证作为后备。
  2. 即时反馈:使用 CSS 和 JavaScript 提供即时的验证反馈。
  3. 清晰的错误消息:确保错误消息具体且有帮助。
  4. 可访问性:确保验证错误对屏幕阅读器用户可访问。
  5. 性能考虑:尽量使用原生验证,减少 JavaScript 使用。

浏览器兼容性

HTML5 表单验证在现代浏览器中得到了广泛支持。但在使用新特性时,仍需考虑兼容性问题。可以使用特性检测来提供优雅的降级处理:

代码语言:javascript
AI代码解释
复制
if (!Modernizr.formvalidation) {
    // 加载 polyfill 或使用 JavaScript 验证库
}

结语

HTML5 表单验证 API 为 Web 开发者提供了一种简单而强大的方式来实现客户端表单验证。它不仅提高了开发效率,还能改善用户体验和页面性能。从简单的必填字段检查到复杂的自定义验证规则,HTML5 表单验证 API 都能胜任。

然而,在使用这些特性时,开发者需要考虑浏览器兼容性、可访问性和用户体验等多个方面。正确地实现和优化表单验证,结合服务器端验证,可以显著提升 Web 应用的质量和用户满意度。

随着 Web 标准的不断发展,表单验证技术可能会有新的进展。持续关注这一领域的最新发展和最佳实践,将有助于您在项目中更好地实现表单验证功能,创造出更加用户友好、高效可靠的 Web 表单。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
当然,这个linux界面仅能用于学习linux基本操作,想要实战处理数据跑程序的话你的电脑配置不够,需要用到服务器。如果你所在单位有服务器,可以直接申请账号。如果没有可以去阿里云官网看看。远程登录服务器需要下载一个免安装软件putty,需要ip地址和用户名就可以登录了。
当然,这个linux界面仅能用于学习linux基本操作,想要实战处理数据跑程序的话你的电脑配置不够,需要用到服务器。如果你所在单位有服务器,可以直接申请账号。如果没有可以去阿里云官网看看。远程登录服务器需要下载一个免安装软件putty,需要ip地址和用户名就可以登录了。
回复回复点赞举报
推荐阅读
call,apply,bind 的完全实现和理 解
apply(),call()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是第一个参数。
ZEHAN
2020/09/23
8830
JavaScript之手写call、apply、bind函数
😎 手写call函数 实现步骤: 判断调用对象是否为函数,即使我们是定义在函数的原型上的,但是可能出现使用call等方式调用的情况 判断传入上下文对象是否存在,如果不存在,则设置为window 处理传入的参数,截取第一个参数后的所有参数 将函数作为上下文对象的一个属性 使用上下文对象来调用这个方法,并保存返回结果 删除刚才新增的属性 Function.prototype.myCall=function(context){ //判断调用对象 if(typeof this !== 'funct
henu_Newxc03
2022/05/11
4070
JS手撕(四) call、apply、bind、柯里化、偏函数
所以原理就是给传入的第一个参数添加临时方法,然后去调用这个临时方法,这个时候,这个方法的this就会指向第一个参数啦,最后当然还要临时方法删除掉,不留下痕迹。
赤蓝紫
2023/01/01
6210
apply/call/bind 自我实现
面试题:“call/apply/bind源码实现”,事实上是对 JavaScript 基础知识的一个综合考核。
前端迷
2019/09/19
4620
apply/call/bind 自我实现
通过自己实现函数 call,apply,bind 来了解他们的原理
我们知道函数中的call,apply,bind都是可以修改函数的this指向。关于函数的this指向问题可以转到Javascript this 指向问题这篇文章。
踏浪
2019/08/22
8730
解析call、apply、bind三者区别及实现原理
不管在写插件,还是写框架,又或者其它业务开发中。我们都会遇到在执行函数的时候,如果需要保证函数内部this不被污染或者说需要使函数内部this指向到指定对象的时候,都会按情况分别使用到call、apply、bind方法来实现需求。
吴佳
2022/09/26
3.1K0
彻底弄清 this call apply bind 以及原生实现[2019-3-12更新]
有关 JS 中的 this、call、apply 和 bind 的概念网络上已经有很多文章讲解了 这篇文章目的是梳理一下这几个概念的知识点以及阐述如何用原生 JS 去实现这几个功能
JS菌
2019/04/10
4480
彻底弄清 this call apply bind 以及原生实现[2019-3-12更新]
手写apply、call、bind
各位宝宝,马上就要过中国年了,已经开启了放假模式了吗?放假了就好好的休息哈,该玩的时候玩、该学的时候学,就对了~
用户3258338
2020/02/17
5240
前端面试中常考的源码实现
如果一个函数作为一个对象的属性,那么通过对象的.运算符调用此函数,this就是此对象
心谭博客
2020/04/20
4250
面试题目之原生实现call、apply、bind
去年写了篇文章,call、apply和bind的区别,但是随着市场对前端工程师的要求越来越高,我们也要与时俱进,需要深入的了解一下这三个方法的原理。
挥刀北上
2019/07/19
8720
this,call,apply,bind(万字长文)
前言 大家好啊,我是吒儿?,每天努力一点点?,就能升职加薪?当上总经理出任CEO迎娶白富美走上人生巅峰?,想想还有点小激动呢?。 这是我的第13期文章内容✍,希望能够把每一处知识点,说明白,(当然,如
达达前端
2020/06/16
1.3K0
js底层原理,助你更好的完成技术上的提升
1. 实现一个call函数 // 思路:将要改变this指向的方法挂到目标this上执行并返回 Function.prototype.mycall = function (context) { if (typeof this !== 'function') { throw new TypeError('not funciton') } context = context || window context.fn = this let arg = [...arguments].sl
前端老鸟
2019/07/31
7550
前端应该要掌握的几种手写代码实现
https://juejin.im/post/5e24590ef265da3e152d27bc
前端迷
2020/02/19
9300
bind、call、apply 区别
call 和 apply 都是为了解决改变 this 的指向。作用都是相同的,只是传参的方式不同。 除了第一个参数外,call 可以接收一个参数列表,apply 只接受一个参数数组。
前端迷
2019/12/05
6780
一文理解 this、call、apply、bind
记得差不多在两年多之前写过一篇文章 两句话理解js中的this[1],当时总结的两句话原话是这样的:
木子星兮
2020/07/17
4610
【THE LAST TIME】this:call、apply、bind
讲道理,这篇文章有些拿捏不好尺度。准确的说,这篇文章讲解的内容基本算是基础的基础了,但是往往这种基础类的文章很难在啰嗦和详细中把持好。文中道不到的地方还望各位评论多多补充指正。
Nealyang
2019/10/18
6480
【THE LAST TIME】this:call、apply、bind
死磕 36 个 JS 手写题(搞懂后,提升真的大)
作为一个程序员,代码能力毋庸置疑是非常非常重要的,就像现在为什么大厂面试基本都问什么 API 怎么实现可见其重要性。我想说的是居然手写这么重要,那我们就必须掌握它,所以文章标题用了死磕,一点也不过分,也希望不被认为是标题党。
用户4456933
2021/06/01
1.2K0
call、apply、bind
刚开始写技术笔记的时候,很浅显的写了一篇this的指向问题,现在看起来不能说错误百出,但也确实是没什么技术水平。今天分享自己对于call、apply、bind新的认识,并手写一个自己的call、apply、bind。
wade
2020/04/23
1.2K0
call、apply、bind实现原理
call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。即:可以改变当前函数的this指向;还会让当前函数执行。
ClyingDeng
2022/11/29
5010
bind、call、apply的实现
bind、call、apply是JavaScript中Function.prototype非常重要的三个方法,他们的作用是改变this的指向。三者的区别是:
kai666666
2020/10/17
5580
相关推荐
call,apply,bind 的完全实现和理 解
更多 >
LV.1
知名扫地机公司VSLAM算法工程师
目录
  • 引言
  • 基本概念
  • 使用 HTML5 表单验证
    • 1. 必填字段
    • 2. 模式匹配
    • 3. 长度限制
    • 4. 范围限制
    • 5. 类型验证
  • CSS 伪类
  • JavaScript API
    • 1. 检查表单有效性
    • 2. 检查单个表单控件有效性
    • 3. 设置自定义错误
    • 4. 验证消息
    • 5. 验证状态属性
  • 高级特性和技巧
    • 1. 自定义验证
    • 2. 禁用验证
    • 3. 自定义样式
  • 实际应用示例:注册表单
  • 最佳实践
  • 浏览器兼容性
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场