JS表单验证:className与classList区别详解

复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        span {
            display: inline-block;
            width: 250px;
            height: 30px;
            vertical-align: middle;
            line-height: 30px;
            padding-left: 15px;
        }

        .error {
            color: red;
            background: url(./images/error1.png) no-repeat left center;
        }

        .right {
            color: green;
            background: url(./images/right.png) no-repeat left center;
        }
    </style>
</head>

<body>
    <input type="text">
    <span></span>
    <script>
        const reg = /^[a-zA-Z0-9-_]{6,16}$/
        const input = document.querySelector('input')
        const span = document.querySelector('span')
        input.addEventListener('blur',function () {
            if (reg.test(this.value))
            {
                input.nextElementSibling.innerHTML = "输入正确"
                span.className = 'right'
            }
            else {
                input.nextElementSibling.innerHTML = "请输入6-16位合法字符"
                 span.className = 'error'
            }
        })
    </script>
</body>

</html>

这段表单验证代码中,span.classNamespan.classList.add 这两种操作元素类名方式的区别与联系:

核心区别与联系详解

1. 基本概念与作用
  • 共同点 :两者都是用来操作 DOM 元素的 CSS 类名,最终目的都是为元素添加样式类(比如你的代码中的 righterror)。
  • 核心差异
    • className 是直接覆盖 元素的整个类名字符串,相当于给元素的 class 属性重新赋值;
    • classList.add()追加一个类名到元素的类列表中,不会覆盖已有的类名。
2. 结合你的代码具体分析

你的代码中使用了 span.className = 'right' / span.className = 'error',这在当前场景下是合理的,因为你只需要给 span 元素设置唯一 的类名(要么 right 要么 error)。

我们对比两种写法的效果:

javascript

运行

复制代码
// 你的写法:直接覆盖,最终 span 只有一个类名
if (reg.test(this.value)) {
  span.className = 'right'; // 覆盖所有类名,span 的 class 变为 "right"
} else {
  span.className = 'error'; // 覆盖所有类名,span 的 class 变为 "error"
}

// 如果用 classList.add:追加类名,可能导致多个类名共存
if (reg.test(this.value)) {
  span.classList.add('right'); // 若之前有 error,span 的 class 变为 "error right"
} else {
  span.classList.add('error'); // 若之前有 right,span 的 class 变为 "right error"
}
3. classList 的完整用法(补充)

因为 classList.add() 是追加,所以如果要实现和 className 一样的 "替换" 效果,需要先移除旧类名:

javascript

运行

复制代码
if (reg.test(this.value)) {
  span.classList.remove('error'); // 先移除错误类
  span.classList.add('right');    // 再添加正确类
} else {
  span.classList.remove('right'); // 先移除正确类
  span.classList.add('error');    // 再添加错误类
}

// 更简洁的方式:toggle 或 replace
span.classList.replace('error', 'right'); // 直接替换类名(ES6+)
// 或
span.classList.toggle('right', reg.test(this.value)); // 根据条件添加/移除
span.classList.toggle('error', !reg.test(this.value));
4. 适用场景对比
方式 特点 适用场景
element.className 直接覆盖,操作简单 元素只需要一个类名,且需完全替换
element.classList 精细操作(增 / 删 / 查 / 切换) 元素需要多个类名,或按需增删类名

总结

  1. 联系:两者都用于操作 DOM 元素的 CSS 类名,最终都会影响元素的样式;
  2. 核心区别className覆盖式赋值classList.add()追加式添加
  3. 使用建议 :你的代码中因为只需要单一类名(right/error 二选一),用 className 是简洁且合理的;如果元素需要多个类名共存(比如同时有 tipright),则优先用 classList(先删后加)。
相关推荐
zhensherlock2 天前
Protocol Launcher 系列:Mail Assistant 轻松发送 HTML 邮件
前端·javascript·typescript·node.js·html·github·js
cuoluoche2 天前
postman接口请求response是base64-图片这类的可视化。
js
Huanzhi_Lin2 天前
关于V8/MajorGC/MinorGC——性能优化
javascript·性能优化·ts·js·v8·新生代·老生代
百撕可乐3 天前
WenDoraAi官网NextJS实战03:项目插件与Header组件
react.js·js
我命由我123453 天前
React - 组件优化、children props 与 render props、错误边界
前端·javascript·react.js·前端框架·html·ecmascript·js
我命由我123456 天前
在 React 项目中,配置了 setupProxy.js 文件,无法正常访问 http://localhost:3000
开发语言·前端·javascript·react.js·前端框架·ecmascript·js
CyrusCJA6 天前
Nodejs自定义脚手架
javascript·node.js·js
可问春风_ren8 天前
HTML零基础进阶教程:解锁表单、多媒体与语义化实战
前端·git·html·ecmascript·reactjs·js
我命由我1234511 天前
HTML 开发 - HTML 描述列表标签(<dl>、<dt>、<dd>)
前端·javascript·css·html·css3·html5·js
我命由我1234511 天前
React - 类组件 setState 的 2 种写法、LazyLoad、useState
前端·javascript·react.js·html·ecmascript·html5·js