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(先删后加)。
相关推荐
27669582929 小时前
美团 小程序 mtgsig
python·小程序·node·js·mtgsig1.2·美团小程序·大众点评小程序
军军君019 天前
Three.js基础功能学习十一:动画与音频
前端·javascript·3d·js·threejs·三维
刘一说10 天前
Vue3 模块语法革命:移除过滤器(Filters)的深度解析与迁移指南
前端·vue.js·js
曲幽10 天前
JavaScript流程控制:从混乱条件到优雅遍历,一次讲清如何让代码听话
javascript·web·js·for·while·if·if else
乐迁~10 天前
如何使用html2canvas和jsPDF库来解决PDF导出时分页内容截断问题(下--表格行截断处理)
pdf·js
心.c12 天前
文件上传 - 入门篇
前端·javascript·vue.js·node.js·js
可问春风_ren13 天前
前端文件上传详细解析
前端·ecmascript·reactjs·js
lcc18717 天前
JS 隐式转换和显示转换
js
winfredzhang19 天前
从零构建:基于 Node.js 的全栈视频资料管理系统开发实录
css·node.js·html·音视频·js·收藏,搜索,缩略图