classlist.contains() 是最直接、标准且语义明确的判断方法,返回布尔值,兼容ie10+,优于 classname.includes() 和正则匹配。

classList.contains() 是最直接的判断方法
判断一个元素是否含有某个类名,classList.contains() 是标准、简洁且语义明确的方式。它返回布尔值,不抛错、不隐式转换,适合所有现代浏览器(IE10+)。
常见错误是误用 className.includes() 或正则匹配——前者对多类名(如 "btn btn-primary active")容易误判,后者易漏边界或大小写问题。
-
element.classList.contains("active")✅ 安全、精确、区分大小写 -
element.className.includes("active")❌ 可能匹配到"inactive"中的"active" -
element.className.match(/\bactive\b/)⚠️ 可行但冗余,且需处理 null 返回值
注意 classList 是只读的 DOMTokenList 对象
classList 不是数组,不能用 indexOf 或 find;也不是字符串,不能直接 .split()。试图赋值 element.classList = "new" 会报错 TypeError: Cannot set property classList of #<htmlelement> which has only a getter</htmlelement>。
如果需要批量判断多个类名,可结合 Array.from() 或展开语法:
const el = document.getElementById("my-btn");
const neededClasses = ["btn", "btn-primary", "disabled"];
const allExist = neededClasses.every(cls => el.classList.contains(cls));
IE9 及更早版本不支持 classList,需降级方案
若项目仍需兼容 IE9,classList 不存在,此时应检测 element.classList 是否为 undefined,再回退到空格分隔的字符串处理:
- 用
element.className.split(/\s+/).includes("active")替代(注意空字符串过滤) - 或封装一个兼容函数:
hasClass(el, "active"),内部先查classList,失败再走字符串逻辑 - 避免使用
el.className.indexOf("active") !== -1—— 同样存在子串误匹配风险
动态类名场景下,contains() 仍可靠但要注意时机
在 Vue/React 等框架中,或通过 JS 异步添加类后立即判断,容易因 DOM 更新未完成而得到旧结果。例如:
el.classList.add("loading");
console.log(el.classList.contains("loading")); // true ✅
// 但如果 add 是异步触发(如 await nextTick),这里可能还是 false
关键点:只要 add()/remove() 已同步执行完毕,contains() 就立刻反映真实状态;它不“预测”,也不“缓存”,只读取当前 DOM 的实际类列表。
真正容易被忽略的是:服务端渲染(SSR)页面首次 hydrate 前,JS 获取的 classList 是服务端输出的静态结果,和客户端逻辑可能存在短暂不一致。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











