整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

优雅的表单校验

优雅的表单校验:打造用户友好且高效的前端交互体验

**引言**

在Web应用开发中,表单是用户与系统进行信息交互的核心载体。如何实现优雅且高效的表单校验,既能确保数据的有效性和安全性,又能提升用户体验,成为每个前端开发者必须掌握的重要技能。本文将深入探讨表单校验的设计原则、实战技巧以及现代JavaScript库如React中的最佳实践,并通过实例代码演示如何实现这一目标。

## **一、表单校验的重要性及设计原则**

### **1. 表单校验的重要性**

- 数据完整性:防止因用户输入错误导致的数据丢失或损坏。

- 系统安全:对敏感信息进行验证,防止恶意攻击和注入。

- 用户体验:及时反馈,降低用户出错概率,提升操作流畅度。

### **2. 设计原则**

- **实时反馈**:提供实时校验,减少提交后才显示错误的滞后感。

- **清晰提示**:错误信息应简洁明了,指明具体问题并给出解决建议。

- **容错处理**:对于可选但格式严格的内容,允许用户暂时跳过或选择临时保存。

- **渐进增强**:针对不同浏览器和设备,提供兼容性强且一致的校验体验。

## **二、HTML5原生表单校验**

### **3. HTML5内置校验属性**

```html

<form>

<label for="email">邮箱:</label>

<input type="email" id="email" required placeholder="请输入您的邮箱">

<!-- 使用required属性要求必填,type=email自动校验邮箱格式 -->


<label for="password">密码(6-20个字符):</label>

<input type="password" id="password" pattern=".{6,20}" required>

<!-- pattern属性用于设置正则表达式以校验输入内容 -->


<button type="submit">提交</button>

</form>

```

### **4. 自定义错误提示**

```javascript

document.querySelector('form').addEventListener('invalid', function(event) {

event.preventDefault(); // 阻止默认错误提示

const input = event.target;

input.setCustomValidity(''); // 清除默认错误信息

if (!input.validity.valid) { // 检查有效性

input.setCustomValidity('您输入的信息不符合要求,请检查后重新输入');

}

});

```

## **三、JavaScript深度定制表单校验**

### **5. JavaScript自定义校验函数**

```javascript

function validateForm(form) {

const emailInput = form.email;

const passwordInput = form.password;

if (!/^\S+@\S+\.\S+$/.test(emailInput.value)) {

emailInput.setCustomValidity('邮箱格式不正确');

} else {

emailInput.setCustomValidity('');

}

if (passwordInput.value.length < 6 || passwordInput.value.length > 20) {

passwordInput.setCustomValidity('密码长度需在6到20个字符之间');

} else {

passwordInput.setCustomValidity('');

}

}

// 绑定表单提交事件

document.querySelector('form').addEventListener('submit', function(event) {

event.preventDefault();

validateForm(this);

if (this.checkValidity()) { // 执行自定义校验并通过时,再调用checkValidity确认所有原生校验也通过

// 提交表单逻辑...

}

});

```

## **四、React中的表单校验**

### **6. React Hooks结合Formik实现表单校验**

首先安装`formik`库:

```bash

npm installformik@latest --save

```

然后使用Formik创建一个具有校验功能的React表单组件:

```jsx

import React from 'react';

import { Formik, Form, Field, ErrorMessage } from 'formik';

const initialValues = { email: '', password: '' };

const validationSchema = Yup.object().shape({

email: Yup.string().email('无效的邮箱地址').required('邮箱为必填项'),

password: Yup.string().min(6, '密码至少6位').max(20, '密码不能超过20位').required('密码为必填项'),

});

const MyForm = () => (

<Formik

initialValues={initialValues}

validationSchema={validationSchema}

onSubmit={(values, { setSubmitting }) => {

setTimeout(() => {

alert(JSON.stringify(values, null, 2));

setSubmitting(false);

}, 400);

}}

>

{({ isSubmitting }) => (

<Form>

<div>

<label htmlFor="email">邮箱:</label>

<Field type="email" name="email" />

<ErrorMessage name="email" component="div" />

</div>

<div>

<label htmlFor="password">密码(6-20个字符):</label>

<Field type="password" name="password" />

<ErrorMessage name="password" component="div" />

</div>

<button type="submit" disabled={isSubmitting}>

{isSubmitting ? '提交中...' : '提交'}

</button>

</Form>

)}

</Formik>

);

export default MyForm;

```

## **五、总结与展望**

优雅的表单校验不仅在于技术实现,更在于设计理念。从基础的HTML5特性到高级的JavaScript定制,再到现代框架如React提供的解决方案,我们始终要关注用户体验,让表单校验成为增强用户信任、简化交互流程的关键环节。随着Web生态的发展,新的表单处理库和模式不断涌现,持续跟进学习和实践才能把握未来趋势,创造出更加出色的表单交互体验。

单属性汇总:

1 name属性

服务器会识别不同的name属性,并根据name属性来捕获不同元素内的数据。

2 value属性

value 属性为 input 元素设定值。

对于不同的输入类型,value 属性的用法也不同:

type="button", "reset", "submit" - 定义按钮上的显示的文本

type="text", "password", "hidden" - 定义输入字段的初始值

type="checkbox", "radio", "image" - 定义与输入相关联的值

注释:<input type="checkbox"> 和 <input type="radio"> 中必须设置 value 属性。

注释:value 属性无法与 <input type="file"> 一同使用。

注意:单选框和复选框传递数据到数据库时一定要设置value, 否则插入数据失败;

3 type属性

它决定了<input>标签在页面中的表现样式和功能

text 文本框

password 密码框

radio 单选框

checkbox 复选框

file 文件域

hidden 隐藏域

image 图像域

submit 提交按钮

reset 重置按钮

button 普通按钮

4 size属性

列表框中size属性用来设置列表框显示的行数;

文本框和密码框会使用size属性设置域的显示宽度;

5 disabled属性

定义disabled属性可以禁止使用该元素;

无法将数据提交到服务器处理;

6 readonly属性

常用在输入性表单对象中(如文本框、密码框、文本区域),用来禁止输入任何信息;

可以将数据提交到服务器处理;

7 checked属性

它与disabled属性一样没有属性值,常用在选择性表单对象中,定义对象处于被选中状态(如单选按钮和复选框)

但在列表框或者下拉式菜单中,为了表示被选中的项目,可使用selected属性;

7 placeholder属性

规定帮助用户填写输入字段的提示。

表单对象:

1 文本框

<input type="text" name="textfield" id="textfield" value="单行文本框" size="20" maxlength="20">

必需的属性:name type

2 密码域

<input type="password" name="passwordfield" id="passwordfield">

必需的属性:name type

3 文本域

<textarea name="textarea" cols="20" rows="5" wrap="physical"></textarea>

必需的属性:name cols rows

wrap属性 默认值:输入的文本会自动换行。当数据提交到服务器被处理时, 换行符不会随输入的文本一同被提交到服务器;

off(也可写成wrap):不自动换行, 当输入的内容超出文本区域右边界时, 文本将向左滚动, 并显示滚动条。

如果希望换行,必须手动输入回车键才能将插入点移到下一行;

virtual:文本能够自动换行, 当数据提交到服务器被处理时, 换行符不会随输入文本一同提交到服务器;(默认值)

physical:文本能够自动换行, 当数据提交到服务器被处理时, 换行符将会随输入的文本一同被提交到服务器进行处理;

关于如何限制文本域输入字符串的长度 见javascript|语法|设置文本框

HTML5中wrap中属性值修改为hard|soft

soft 当在表单中提交时, textarea 中的文本不换行, 默认值。

hard 当在表单中提交时, textarea 中的文本换行(包含换行符)。

当使用 "hard" 时, 必须规定 cols 属性

4 单选按钮

单选按钮传递的信息简单,如1或0、True或False。

<input type="radio" name="radio" value="1"/>选项1
<input type="radio" name="radio" value="2"/>选项2
<input type="radio" name="radio" value="3"/>选项3

多个单选按钮通过定义相同的name属性, 以实现捆绑在一起;

必需的属性:type name value

5 复选框

<input type="checkbox" name="checkbox[]" value="1"/>选项2
<input type="checkbox" name="checkbox[]" value="2"/>选项2
<input type="checkbox" name="checkbox[]" value="3"/>选项2

通过设置相同的name属性可以把多个复选框捆绑在一起;

必需的属性:type name value

6 列表框/下拉菜单

<select name="select" size=1>
<option value="1">1</option>
<option value="2" selected="selected">2</option>
<option value="3">3</option>
</select>

如果select元素中不设置size属性,则该元素会显示为下拉菜单样式

<select name="select" size="1" multiple="multiple">
<option value="1">1</option>
<option value="2" selected="selected">2</option>
<option value="3">3</option>
</select>

如果希望以列表框形式显示,则可以使用size属性指定列表框的高度(显示几个选项);

还可以通过mutiple属性定义列表框是否为多选(默认是单选);

通过<optgroup>标签把相关的选项组合在一起:

<select>
<optgroup label="PHP版块">
<option value ="resource">资源共享</option>
<option value ="study">学习交流</option>
<option value ="salary">薪酬待遇</option>
</optgroup>
<optgroup label="IOS版块">
<option value ="resource">资源共享</option>
<option value ="study">学习交流</option>
<option value ="salary">薪酬待遇</option>
</optgroup>
</select>

注意:其中PHP版块和IOS版块不能被选中

所有主流浏览器都支持 <optgroup> 标签。

7 文件域

<input type="file" name="file"/>
<input type="file" name="file" multiple/>

8 按钮

提交按钮

<input type="submit" name="" value="提交"/>

name值必须给出

重置按钮

<input type="reset" name="" value="重置"/>

普通按钮

<input type="button" name="" value="普通按钮"/>

它一般是配合javascript来使用;

关于控制表单提交按钮见: javascript|语法|控制表单提交

9 图像域

<input type="image" name="image" value="提交" src="images/vote_d.gif" alt="提交" align="middle"/>

10 隐藏域

限制上传文件大小

<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />

传递ID值

<input type="hidden" name="id" value="<?php echo $result['id'];?>" />

11 button标签

在 button 元素内部,您可以放置内容,比如文本或图像。这是该元素与使用 input 元素创建的按钮之间的不同之处。

<button type="button" name="button" value="按钮"><img src="hw001.jpeg"/></button>

普通按钮<button type="button">普通按钮</button> 它一般是配合javascript来使用, 默认值

提交按钮<button type="submit">提交按钮</button>

重置按钮<button type="reset">重置按钮</button>

提交表单

enctype属性

该属性包含两种方式:

application/x-www-form-urlencoded 是默认编码类型

multipart/form-data

multipart/form-data编码方式可以用来传输二进制数据或者非ASCII字符的文本(如图片、不同格式的文件等),上传文件必须使用此属性

multipart: 多部件的

multiple: 多重的

text/plain

text/plain将表单属性发送到电子邮箱时,enctype的值必须设为"text/plain",否则将会出现乱码。

发送电子邮件的表单程序

<form name="form1" method="post" action="mailto:marker@broadview.com.cn" enctype="text/plain">
</form>

action 表单提交的脚本

如果传递到本页面,则直接输入控制 action=""

表单提交方式method:post/get

<form action="test.php?id=5" method="post" >
name: <input type="text" name="name" value="100">
</form>

id=5是get传, name="100" 是post传! //高洛峰解释

action="" 表示传递到当前脚本文件

target 指定提交到哪一个窗口

_blank 打开新窗口

_self 当前的窗口,默认值

_parent 上一层窗口

_top 最上层窗口

框架名称 指定指定窗口或框架名称

label标签

作用: 扩大触控区域, 为了提升用户体验, 点击文字也能选中表单

<form action=" method="get" accept-charset="utf-8">
<label>电子邮箱: <input type="text" name="email" value="" placeholder="请输入电子邮箱"/></label><br/>
<label>密码: <input type="password" name="password"/></label><br/>
<label for="address">地址</label>
<input type="text" name="address" id="address" placeholder="请输入地址" />
</form>

for与id一致

<input type="radio" id="sec" name="sex"> <label for="sex">男</label>

简化写法:

<label><input type="checkbox"/>周杰伦-晴天</label>

注意: "for" 属性可把 label 绑定到另外一个元素。请把"for"属性的值设置为相关元素的 id 属性的值。

PHP实例:创建发送邮件信息的html表单

代码:

<html>
<head>
<title>简单邮件发送表单</title>
</head>
<body>
<h1>Mail Form</h1>
<form name="form1" method="post" action="simpleEmail.php">
<table>
<tr><td><b>To</b></td><td><input type="text" name="mailto" size="35"></td></tr>
<tr><td><b>邮件主题:</b></td>
<td><input type="text" name="mailsubject" size="35"></td></tr>
<tr><td><b>邮件内容</b></td>
<td><textarea name="mailbody" cols="50" rows="7"></textarea></td>
</tr>
<tr><td colspan="2">
<input type="submit" name="Submit" value="发送">
</td>
</tr>
</table>
</form>
</body>
</html>


simpleEmail.php

.form 标签

1)作用

<form></form>定义表单的开始位置和结束位置,表单提交时的内容就是<form>表单中的内容

2)基本格式

<form action="服务器端地址(接受表单内容的地址)" name="表单名称" method="post|get">...</form>

3)常用属性

1.name

表单名称

2.method

传送数据的方式,分为post和get两种方式:

  1. get方式:get方式提交时,会将表单的内容附加在URL地址的后面,所以限制了提交的内容的长度,不超过8192个字符,且不具备保密性。
  2. post方式:post方式提交时,将表单中的数据一并包含在表单主体中,一起传送到服务器中处理,没有数据大小限制。
3.action

表单数据的处理程序的URL地址,如果为空则使用当前文档的URL地址,如果表单中不需要使用action属性也要指定其属性为”no“。

4.enctype

设置表单的资料的编码方式。属性值:

  1. application/x-www-form-urlencoded:在发送前编码所有字符(默认)
  2. multipart/form-data:不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
  3. text/plain:空格转换为 "+" 加号,但不对特殊字符编码。
5.target

和超链接的属于类似,用来指定目标窗口。

2.input 标签

1)注意

input 标记没有结束标记。

2)基本语法

<input type="" name="" value="" size="" maxlength="">

3)属性

1.type属性
  1. text:文本输入域
  2. password:密码输入域
  3. submit:提交按钮
  4. reset:重置按钮
  5. button:普通按钮
  6. radio:单选按钮,可以使用”checked“属性来设置默认选中项
  7. checkbox:复选框,可以使用”checked“属性来设置默认选中项
  8. hidden:隐藏表单域
  9. file:文件域
2.name属性

定义控件的名称

3.value属性

初始化值,打开浏览器时,文本框中的内容

4.size属性

设置控件的长度

5.maxlength属性

输入框中最大允许输入的字符数

3.textarea 标签

1)作用

使用 textarea 标记可以实现一个能够输入多行文本的区域。

2)语法格式

rows属性和cols属性分别用来指定,显示的行数和列数,单位是字符个数;value指定传送到服务器上面的值。

<textarea name="name" rows="value" cols="value" value="value">... ... </textarea>

4.select 标签

1)作用

菜单下拉列表域,生成一个下拉列表。

2)option 标签

作用:

option 标记用来指定列表中的一个选项,需要放在 select 之间。

值:

  1. value:给选项赋值,指定传送到服务器上面的值。
  2. selected:指定默认的选项。

3)语法格式

<select name="" size="value" multiple>    <option value="value1" selected>选项1</option>    <option value="value2">选项2</option>    <option value="value3">选项3</option>    ... ... ...</select>

4)属性

  1. multiple属性:multiple属性不用赋值,其作用是,表示用可以多选的下来列表,如果没有这个属性就只能单选。
  2. size属性:设置列表的高度。
  3. name属性:定义这个列表的名称。

5.label 标签

1)作用

用于绑定一个表单元素, 当点击label标签的时候, 被绑定的表单元素就会获得输入焦点

2)语法
<label for="male">Male</label><input type="radio" name="sex" id="male">

6.举例

<form name="form" method="post" action="no" enctype="multipart/form-data">  <label for="male">账号:</label><input type="text" name="username" value="admin"  id="male"><br>  密码:<input type="password" name="password" size="50" maxlength="6"><br>  性别:<input type="radio" name="sex" value="男"> 男    <input type="radio" name="sex" value="女" checked="checked"> 女<br>  兴趣:<input type="checkbox" name="interest" value="篮球">篮球    <input type="checkbox" name="interest" value="足球" checked="checked">足球    <input type="checkbox" name="interest" value="羽毛球" checked="checked">羽毛球    <input type="hidden" name="hidden"><br>  头像:<input type="file" name="file"><br>  简介:    <textarea rows="10" cols="30">        </textarea><br>  城市:    <select name="city" multiple>      <option value="beijing">北京</option>      <option value="shanghai" selected>上海</option>      <option value="nanjing">南京</option>      <option value="guangdong">广东</option>    </select>  <br>  <input type="submit" value="注册">  <input type="reset">  <input type="button" value="普通按钮"></form>