项目中如果应用了常用的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非常相似,在一定程度上,也能够方便我们加深对这几个方法的理解。

为DOM节点添加或者删除class的更多相关文章

  1. Javascript进阶篇——(DOM—节点---插入、删除和替换元素、创建元素、创建文本节点)—笔记整理

    插入节点appendChild()在指定节点的最后一个子节点列表之后添加一个新的子节点.语法: appendChild(newnode) //参数: //newnode:指定追加的节点. 为ul添加一 ...

  2. Openshift 节点添加和删除

    1.节点添加 在新节点上编辑yum源/etc/yum.repo.d/ocp.repo /etc/hosts在主和节点上都加上相应信息 编辑host文件,加入 [OSEv3:children] mast ...

  3. MongoDB 副本集节点添加与删除

    replica set多服务器主从,添加,删除节点,肯定会经常遇到的.下面详细说明一下,添加,删除节点的2种方法. 一,利用rs.reconfig,来添加,删除节点 1,添加节点 查看复制打印 rep ...

  4. JavaScript学习 - 基础(八) - DOM 节点 添加/删除/修改/属性值操作

    html代码: <!--添加/删除/修改 --> <div id="a1"> <button id="a2" onclick=&q ...

  5. jQuery的节点添加、删除、替换等操作

    //几种添加节点的方法 //$("p").append("<b>你好吗?</b>");//向p元素中追加<b> //$(&q ...

  6. ztree-编辑节点(树节点添加,删除,修改)

    <!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - addNodes / editName / rem ...

  7. js给节点添加或删除类名

    为 <div> 元素添加 class: document.getElementById(“myDIV”).classList.add(“mystyle”); 为 <div> 元 ...

  8. 将HTML字符转换为DOM节点并动态添加到文档中

    将HTML字符转换为DOM节点并动态添加到文档中 将字符串动态转换为DOM节点,在开发中经常遇到,尤其在模板引擎中更是不可或缺的技术. 字符串转换为DOM节点本身并不难,本篇文章主要涉及两个主题: 1 ...

  9. 用JS添加和删除class类名

    下面介绍一下如何给一个节点添加和删除class名 添加:节点.classList.add("类名"): 删除:节点.classList.remove("类名") ...

随机推荐

  1. 阿里云学习笔记之Java Web环境搭建

    1. 下载JDK7 http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521 ...

  2. Vim NerdTree

    参考链接:http://yang3wei.github.io/blog/2013/01/29/nerdtree-kuai-jie-jian-ji-lu/ 切换工作台和目录 ctrl + w + h 光 ...

  3. (转)oms系统安装php的redis扩展

    lnmp自带redis安装程序 https://lnmp.org/faq/addons.html ======== 还需要关闭防火墙.如果出现redis server gone away. http: ...

  4. system.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0) 问题

    页面控件没有做限制.提交后还可以继续点击,造成了在短时间内的多次请求.查看日志两次错误在200ms之内. 错误信息 system.Data.Entity.Infrastructure.DbUpdate ...

  5. Linux学习 LVM ***

    一.前言 LVM,逻辑卷管理工具,它的作用是提供一种灵活的磁盘管理办法.通常我们的某个分区用完了,想要扩容,很麻烦.但是用lvm就可以很方便的扩容,收缩. 看它的原理图: 它的原理大致是:首先将磁盘做 ...

  6. Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering

    <Windows Azure Platform 系列文章目录> 在有些时候,我们需要通过VNet Peering,把两个虚拟网络通过内网互通互联.比如: 1.在订阅A里的Virtual N ...

  7. mysql++ 3.2.3 源码安装

    https://tangentsoft.com/mysqlpp/home 下载 wget https://tangentsoft.com/mysqlpp/releases/mysql++-3.2.3. ...

  8. 黄聪:AngularJS如何在filter中相互调用filter

    调用方式如下: app.filter('filter2', function( $filter ) { return function( input) { return $filter('filter ...

  9. 使用RetionalRose根据现有的java工程逆向生成类图

    1.进入RetionalRose选择J2EE模板 2.在菜单栏选择tools->java/j2EE->reverse engineer 3.编辑路径Edit CLASSPATH选择要生成类 ...

  10. python3学习笔记一(标识符、关键字)

    查看Python版本 可以命令窗口,windows使用win+R调出cmd运行框,输入以下命令: python -V 进入python的交互编辑模式,也可查看 D:\Python3.6\Scripts ...