项目中如果应用了常用的javascript类库,多数情况下,这些已经封装好的类库,都会封装一个类似于addClass和removeClass的方法,以便于我们对DOM节点的class进行操作。

以jQuery为例:

$(dom).addClass("a").removeClass("b");

由于是封装好的方法,我们甚至都不需要检查需要操作的class在DOM中是否存在,用起来的感觉真的是不要太爽。

那么如果项目中没有使用任何类库呢,完全原生JavaScript,如何操作DOM节点的class呢?

以不做任何封装库为例,仅仅是封装两个简单的函数:

   //  添加class
function addClass(kls, dom) {    
var klsReg = new RegExp(kls, 'ig');
for (var i = 0; i<dom.length; i++){
var node = dom[i];
var klses = node.className;
if (!klsReg.test(klses)) {
node.className = klses + ' ' +kls
}
console.log(klses)
}
}
addClass("a", ops)
  // 删除class
function removeClass(kls, dom) {
var klsReg = new RegExp(kls, 'ig');
for (var i = 0; i<dom.length; i++){
var node = dom[i];
var klses = node.className;
if (klsReg.test(klses)) {
node.className = node.className.replace(kls, '')
}
}
}
removeClass("red", ops)

  其实也没什么可以疑惑的地方,也就是使用正则表达式对所需要操作的DOM节点进行判断,如果不存在class名为"a",则直接添加,否则忽略;如果是删除class的话,如果存在需要删除的class "b",则删除对应的b。

在封装个人类库中,这里需要注意的是,函数需要作为对象prototype的方法,并且返回该对象,以用于连缀的写法。

在html5的API中提供了一种新的写法,完全摆脱了正则表达式(意思是不在需要我们自己写正则表达式了):

    var ops = document.querySelectorAll("p")
for (let p of ops) {
p.classList.add("blue");
p.classList.remove("red");
}

  需要注意的是,classList这种API是不支持连缀写法的。

  element.classList还有另外三个方法:

  item ( Number )按集合中的索引返回类值。

  toggle ( String [, force] )当只有一个参数时:切换 class value; 即如果类存在,则删除它并返回false,如果不存在,则添加它并返回true。

    当存在第二个参数时:如果第二个参数的计算结果为true,则添加指定的类值,如果计算结果为false,则删除它。第二个参数的兼容性并不是特别好。

  contains ( String )检查元素的类属性中是否存在指定的类值。

    var ops = document.querySelectorAll("p")
for (let p of ops) {
p.addEventListener("click", function () {
this.classList.toggle("blue")
}, false)
}

  其实仔细看这几个方法,会发现,与jQuery中的addClass, removeClass, toggleClass, contains非常相似,在一定程度上,也能够方便我们加深对这几个方法的理解。

最新文章

  1. GreenDao2.2升级GreenDao3.0的适配之路
  2. iOS9 HTTP 通信报错解决方案
  3. 其实今天没有欲望..-MySQLi
  4. 用WebBrowser采集渲染后的HTML页面
  5. POJ1141 Brackets Sequence
  6. ADO.NET笔记——利用Command对象的ExecuteScalar()方法返回一个数据值
  7. MySQL flush privileges 명령어
  8. 抓取锁的sql语句-第七次修改
  9. 图论(二分图最大权独立点集):COGS 2051. 王者之剑
  10. (转)javascript组件开发方式
  11. SELECT 场 FROM 表 WHERE 字段 Like 条件
  12. php_常用操作_读取文件_数据库操作
  13. 项目Contact开发中遇到的,引以为戒
  14. SSH三大框架整合步骤
  15. JDK自带的缓存--包装类的缓存
  16. vue2.0 导出Excel表格数据
  17. [Astar2008]Black-Whilte-Tree
  18. 简单的SSM框架搭建教程
  19. android.view.animation(3) - LayoutAnimationController 和 GridLayoutAnimationController
  20. vue下载文件

热门文章

  1. jmeter—JDBC request动态参数设置
  2. ASP.NET AJAX入门系列
  3. DeviceIoControl 驱动交互
  4. google浏览器查看源码快捷键 ctrl+U
  5. Azure SQL 数据库仓库Data Warehouse (1) 入门
  6. JAVA多线程之中断机制(stop()、interrupted()、isInterrupted())
  7. Selenium Python FirefoxWebDriver处理打开保存对话框
  8. LeetCode——11. Container With Most Water
  9. mina2中的session
  10. 指定分隔符连接数组元素join()