问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

前端如何做好表单校验

创作时间:
作者:
@小白创作中心

前端如何做好表单校验

引用
1
来源
1.
https://docs.pingcode.com/baike/2568537

前端表单校验是确保用户输入数据合法性和有效性的关键步骤。本文将系统地介绍多种前端表单校验方法,包括HTML5内建校验、JavaScript自定义校验、正则表达式校验、前端框架校验、后端双重校验以及第三方库的使用等。通过这些技术,可以提高表单的用户体验和数据的可靠性。

前端如何做好表单校验?主要方法包括:使用HTML5内建校验、利用JavaScript自定义校验规则、采用正则表达式进行格式校验、结合前端框架和库。其中,利用JavaScript自定义校验规则是实现复杂表单校验的关键。通过JavaScript,我们可以根据用户需求和业务逻辑,灵活地定义各种校验规则,从而提高表单的用户体验和数据的可靠性。

一、HTML5内建校验

HTML5提供了一些内建的表单校验功能,可以在不写任何JavaScript代码的情况下,轻松实现基础的表单校验。这些功能包括必填字段、输入类型、模式匹配等。

1. 必填字段

HTML5新增了一个required属性,可以用于指定某个输入字段是必填的。例如:

<input type="text" required>

当用户提交表单时,如果这个字段为空,浏览器会自动阻止提交并显示提示信息。

2. 输入类型

HTML5新增了多种输入类型,如emailurlnumber等,这些类型会自动进行相应的格式校验。例如:

<input type="email">

当用户输入的内容不是有效的电子邮件地址时,浏览器会自动提示错误。

3. 模式匹配

HTML5的pattern属性允许你使用正则表达式来定义输入字段的格式。例如:

<input type="text" pattern="d{3}-d{3}-d{4}">

这段代码要求用户输入格式为“xxx-xxx-xxxx”的电话号码。

二、利用JavaScript自定义校验规则

虽然HTML5内建校验功能非常方便,但在实际应用中,往往需要更复杂和灵活的校验规则,这时就需要利用JavaScript进行自定义校验。

1. 基本的JavaScript校验

通过JavaScript,我们可以在表单提交事件中,添加自定义的校验逻辑。例如:

document.getElementById("myForm").addEventListener("submit", function(event) {
    var email = document.getElementById("email").value;  
    if (!validateEmail(email)) {  
        event.preventDefault();  
        alert("请输入有效的电子邮件地址");  
    }  
});
function validateEmail(email) {  
    var re = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$/;  
    return re.test(String(email).toLowerCase());  
}  

2. 复杂的校验逻辑

对于更复杂的校验逻辑,例如密码强度校验、用户名唯一性检查等,可以结合异步请求和后台服务进行校验。例如:

document.getElementById("username").addEventListener("blur", function() {
    var username = this.value;  
    checkUsernameUnique(username);  
});
function checkUsernameUnique(username) {  
    fetch(`/api/check-username?username=${username}`)  
        .then(response => response.json())  
        .then(data => {  
            if (!data.isUnique) {  
                alert("用户名已存在,请选择其他用户名");  
            }  
        });  
}  

三、采用正则表达式进行格式校验

正则表达式是一种强大的文本匹配工具,可以用于校验输入字段的格式,例如电子邮件地址、电话号码、身份证号码等。

1. 基本的正则表达式校验

例如,使用正则表达式校验电话号码的格式:

function validatePhoneNumber(phoneNumber) {
    var re = /^d{3}-d{3}-d{4}$/;  
    return re.test(phoneNumber);  
}  

2. 复杂的正则表达式校验

正则表达式还可以用于更复杂的格式校验,例如密码强度校验:

function validatePassword(password) {
    var re = /^(?=.*[A-Za-z])(?=.*d)[A-Za-zd]{8,}$/;  
    return re.test(password);  
}  

这段代码要求密码至少包含8个字符,且同时包含字母和数字。

四、结合前端框架和库

现代前端开发中,常常使用各种框架和库来简化表单校验的工作,例如React、Vue、Angular等。

1. 使用React进行表单校验

在React中,可以使用受控组件和状态管理来实现表单校验。例如:

class MyForm extends React.Component {
    constructor(props) {  
        super(props);  
        this.state = { email: '', isValid: true };  
        this.handleChange = this.handleChange.bind(this);  
        this.handleSubmit = this.handleSubmit.bind(this);  
    }  
    handleChange(event) {  
        this.setState({ email: event.target.value });  
    }  
    handleSubmit(event) {  
        event.preventDefault();  
        if (!this.validateEmail(this.state.email)) {  
            this.setState({ isValid: false });  
        } else {  
            this.setState({ isValid: true });  
            // Submit the form  
        }  
    }  
    validateEmail(email) {  
        var re = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$/;  
        return re.test(email);  
    }  
    render() {  
        return (  
            <form onSubmit={this.handleSubmit}>  
                <input type="email" value={this.state.email} onChange={this.handleChange} />  
                {!this.state.isValid && <span>请输入有效的电子邮件地址</span>}  
                <button type="submit">提交</button>  
            </form>  
        );  
    }  
}  

2. 使用Vue进行表单校验

在Vue中,可以使用指令和计算属性来实现表单校验。例如:

<template>
  <form @submit.prevent="handleSubmit">  
    <input type="email" v-model="email" @input="validateEmail">  
    <span v-if="!isValid">请输入有效的电子邮件地址</span>  
    <button type="submit">提交</button>  
  </form>  
</template>  
<script>  
export default {  
  data() {  
    return {  
      email: '',  
      isValid: true  
    };  
  },  
  methods: {  
    validateEmail() {  
      var re = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$/;  
      this.isValid = re.test(this.email);  
    },  
    handleSubmit() {  
      if (this.isValid) {  
        // Submit the form  
      }  
    }  
  }  
};  
</script>  

3. 使用Angular进行表单校验

在Angular中,可以使用表单控制器和内建的验证器来实现表单校验。例如:

<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">
    <input type="email" name="email" ngModel required email #email="ngModel">  
    <span *ngIf="email.invalid && email.touched">请输入有效的电子邮件地址</span>  
    <button type="submit" [disabled]="myForm.invalid">提交</button>  
</form>  
import { Component } from '@angular/core';
@Component({  
  selector: 'app-root',  
  templateUrl: './app.component.html',  
  styleUrls: ['./app.component.css']  
})  
export class AppComponent {  
  onSubmit(form) {  
    if (form.valid) {  
      // Submit the form  
    }  
  }  
}  

五、结合后端进行双重校验

前端的表单校验可以提高用户体验,但仅靠前端校验是不够的,因为用户可以通过禁用JavaScript绕过前端校验。因此,后端也需要进行双重校验。

1. 后端校验的重要性

后端校验是确保数据完整性和安全性的最后一道防线。无论前端校验多么完善,后端都必须对接收到的数据进行校验。例如,检查字段是否为空,格式是否正确,数据是否符合业务逻辑等。

2. 结合前后端校验

在实际开发中,可以将前后端校验结合起来,前端主要负责提高用户体验,后端负责确保数据的安全性和完整性。例如:

// 前端
document.getElementById("myForm").addEventListener("submit", function(event) {  
    var email = document.getElementById("email").value;  
    if (!validateEmail(email)) {  
        event.preventDefault();  
        alert("请输入有效的电子邮件地址");  
    }  
});
function validateEmail(email) {  
    var re = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$/;  
    return re.test(String(email).toLowerCase());  
}  
// 后端(假设使用Node.js和Express)  
app.post('/submit-form', function(req, res) {  
    var email = req.body.email;  
    if (!validateEmail(email)) {  
        return res.status(400).send("请输入有效的电子邮件地址");  
    }  
    // 处理表单数据  
});
function validateEmail(email) {  
    var re = /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$/;  
    return re.test(email);  
}  

六、使用第三方库

除了自定义校验逻辑,还可以使用一些成熟的第三方库来简化表单校验的工作,例如Joi、Yup、Validator.js等。

1. 使用Joi进行表单校验

Joi是一个功能强大的数据校验库,适用于Node.js和浏览器环境。例如:

const Joi = require('joi');
const schema = Joi.object({  
    email: Joi.string().email({ tlds: { allow: false } }).required(),  
    password: Joi.string().min(8).required()  
});
const { error, value } = schema.validate({ email: 'test@example.com', password: '12345678' });  
if (error) {  
    console.log('校验失败:', error.details);  
} else {  
    console.log('校验成功:', value);  
}  

2. 使用Yup进行表单校验

Yup是一个用于JavaScript对象模式声明和校验的库,常用于React项目中。例如:

import * as Yup from 'yup';
const schema = Yup.object().shape({  
    email: Yup.string().email('请输入有效的电子邮件地址').required('电子邮件是必填项'),  
    password: Yup.string().min(8, '密码至少包含8个字符').required('密码是必填项')  
});
schema.validate({ email: 'test@example.com', password: '12345678' })  
    .then(value => {  
        console.log('校验成功:', value);  
    })  
    .catch(err => {  
        console.log('校验失败:', err.errors);  
    });  

3. 使用Validator.js进行表单校验

Validator.js是一个用于字符串校验和清理的库,例如:

const validator = require('validator');
const email = 'test@example.com';  
const password = '12345678';  
if (!validator.isEmail(email)) {  
    console.log('请输入有效的电子邮件地址');  
}
if (!validator.isLength(password, { min: 8 })) {  
    console.log('密码至少包含8个字符');  
}  

七、用户体验优化

表单校验不仅仅是为了确保数据的正确性,还需要考虑用户体验,提供友好的提示信息和交互。

1. 实时校验

通过实时校验,用户可以在输入过程中及时得到反馈,避免提交后才发现错误。例如:

document.getElementById("email").addEventListener("input", function() {
    var email = this.value;  
    if (!validateEmail(email)) {  
        this.setCustomValidity("请输入有效的电子邮件地址");  
    } else {  
        this.setCustomValidity("");  
    }  
});  

2. 友好的提示信息

提示信息应简洁明了,帮助用户快速理解问题所在。例如:

<input type="email" required>
<span class="error-message">请输入有效的电子邮件地址</span>  

结合CSS样式,可以将错误信息高亮显示,吸引用户注意。

3. 可访问性考虑

在实现表单校验时,还需要考虑可访问性,确保所有用户,包括使用辅助技术的用户,都能顺利完成表单填写。例如,使用ARIA属性提供额外的提示信息:

<input type="email" required aria-describedby="emailHelp">
<span id="emailHelp" class="sr-only">请输入有效的电子邮件地址</span>  

八、总结

做好前端表单校验需要综合运用多种技术和方法,包括使用HTML5内建校验、利用JavaScript自定义校验规则、采用正则表达式进行格式校验、结合前端框架和库、结合后端进行双重校验、使用第三方库、用户体验优化。通过合理的校验策略,可以提高表单的用户体验,确保数据的准确性和安全性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号