HTML5-类库系列 类名的各种操作

HTML5学堂:最近讲师团队在学习JS类库的知识,因此就跟大家一起共享一下类库的搭建吧。今天要讲解的功能是:类名的各种操作。在这里,HTML5学堂提醒各位,不要心急,各种复杂的内容都是从简单的内容一步步调整优化过来的。今天我们在前一篇的基础上来优化我们的功能。

第一步 增加类名 addClass

增加类名应该说是这三种功能当中最简单的一个,类名是一个字符串,只需要使用字符串的连接就能够实现这个功能。

function addClass(obj, newClassName) {
return obj.className += " " + newClassName;
}

我们定义一个功能函数,函数名称为addClass,需要为某个元素增加某个类名,因此这里采用两个参数,作为这个函数的接口。通过obj.className获取到当前该元素的类名,然后在其基础之上,与新类名使用字符串进行连接。注意两种类名之间需要有一个空格。这时候,细心的同学会发现,如果该元素初始没有类名,使用函数处理之后,会在最前面多一个空格。这个地方个人认为没有必要处理,因为它对我们的任何操作是没有什么影响的。

第二步 移除类名 removeClass

移除类名的功能函数就没有增加类名那么简单了~需要使用数组以及字符串等各种方法进行实现。当然也可以通过正则去实现。关于正则的方法,在下面的替换类名部分我们再讲,这里我们重点讲字符串与数组的处理方法。

移除类名的基本原理是:首先我们将元素的类名进行拆分,将这种class="HTML5 lili test",一个元素多个类名的内容,根据空格进行拆分,拆分并放置于数组当中。之后我们将数组中的类名分别和需要移除的类名进行比较,如果相同则删除掉。当所有的类名均比较完成之后,我们使用数组的join方法,将修改后的数组再拼合回字符串,赋值给元素的className(类名)即可。

具体实现代码:

function removeClass(obj, removeClassName) {
var classArr = obj.className.split(/\s+/);
var len = classArr.length;
for (var i = 0; i < len; i++) {
if (classArr[i] == removeClassName) {
delete classArr[i];
};
};
obj.className = classArr.join(" ");
}

第三步 替换类名

替换类名这个部分,看上去很简单,包括我自己在进行操作的时候,一开始也没有注意存在的问题。如果使用正则我们发现相对要简单很多,只需要使用replace方法即可。

function replaceClass(obj, newClassName, oldClassName) {
obj.className = obj.className.replace(oldClassName, newClassName);
}

在这里,我们传递了三个参数,分别是要修改类名的元素、需要替换的旧类名、新类名。使用replace方法,直接进行实现。实现之后自己进行了测试,发现在一种情况下是存在问题的。如下的测试用例,我们希望使用new替换html,按照我们的期望,是将class="wrap html5 html"替换为class="wrap html5 new",但是执行的结果反而是class="wrap new5 html"。

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>H5course - 刘国利 独行冰海</title>
<link rel="stylesheet" href="../css/reset.css">
<script src="../js/core.js"></script>
</head>
<body>
<div>
<p>HTML5 - 类库构建</p>
<p id="con" class="wrap html5 html">独行冰海 - 利利 - 刘国利</p>
<p class="wrap">梦幻雪冰 - 陈能堡</p>
</div>
<script>
replaceClass(con, "new", "html");
</script>
</body>
</html>

造成上述问题的原因是,正则匹配上的问题。我们需要确定是new为开头并且也是以new为结尾,才正常匹配。换句话说,就是使用/\bhtml\b/能够实现合理的匹配。

问题又来了,我们的html是从外部传入到函数内的,html实际上是oldClassName这个变量的变量值。那么我们能不能把\bhtml\b改成\boldClassName\b呢?很明显不现实的。想解决这个问题,我们先得知道如何在正则当中放置变量。

我们生成正则的方法有两种,一种是使用正则字面量的方式进行生成——/正则内容/,另一种是使用构造函数进行生成。使用正则字面量的方法生成时,会发现无论怎么添加变量,变量都会被当做正则的一部分。那么此时,使用第二种方法,正则的构造函数,就能够解决这个问题了。var reg = new RegExp("\\b"+oldClassName+"\\b"); 注意一点:反斜杠需要进行转义。

基本问题解决了,一起来看看我们的功能代码吧~

function replaceClass(obj, newClassName, oldClassName) {
var reg = new RegExp("\\b"+oldClassName+"\\b");
obj.className = obj.className.replace(reg, newClassName);
}

当然,还有一种方法能够实现,使用eval,不过,这种方法但凡学过AJAX部分的同学都知道,会影响JS性能。不过,在这里我还是给出eval的写法:var reg = eval("\\b"+oldClassName+"\\b");

最后,我们解决我们之前遗留的一个问题,如何用正则的方法实现类名的移除?巧妙的使用replace即可,我们只需要将newClassName换成""(空字符串)即可。

于是~完整版代码新鲜出炉喽~~~

/*
* 类名处理 增加、删除、替换
* 替换和移除都使用replaceClass进行控制
* 作者:独行冰海 - 利利
*/
function addClass(obj, newClassName) {
return obj.className += " " + newClassName;
}
function replaceClass(obj, oldClassName, newClassName) {
var reg = new RegExp("\\b"+oldClassName+"\\b");
if (newClassName) {
obj.className = obj.className.replace(reg, newClassName);
} else {
obj.className = obj.className.replace(reg, "");
}
}

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2015-12-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云瓣

JS 异步系列 —— Promise 札记

12830
来自专栏小灰灰

Java学习之深拷贝浅拷贝及对象拷贝的两种方式

I. Java之Clone 0. 背景 对象拷贝,是一个非常基础的内容了,为什么会单独的把这个领出来讲解,主要是先前遇到了一个非常有意思的场景 有一个任务,需要...

42190
来自专栏Python爬虫与数据挖掘

Python正则表达式初识(一)

首先跟大家简单唠叨两句为什么要学习正则表达式,为什么在网络爬虫的时候离不开正则表达式。正则表达式在处理字符串的时候扮演着非常重要的角色,在网络爬虫的时候...

13030
来自专栏编程坑太多

理解 JavaScript 的 async/await

22230
来自专栏ml

uva----11729 Commando war (突击战争)

G Commando War Input: Standard Input Output: Standard Output “Wa...

32670
来自专栏Golang语言社区

初学者需要注意的问题-变量的作用域

go语言支持多变量同时赋值或者初始化,这是一个很方便的特性。它也允许使用:=操作符同时声明部分新变量,并且给已有变量赋值,这会带来一些需要注意的问题,一不小心就...

41870
来自专栏Crossin的编程教室

【Python 第37课】 字典

今天介绍一个python中的基本类型--字典(dictionary)。 字典这种数据结构有点像我们平常用的通讯录,有一个名字和这个名字对应的信息。在字典中,名字...

372110
来自专栏我的博客

init,__construct区别以及PHP魔术方法大汇总

init()是框架设置为初始化函数,当然框架内部还是用的___construct()内置函数;如果你是框架开发者,你当然也可以把初始化函数写成__init(),...

35050
来自专栏别先生

Javascript提升阶段学习

JavaScript 1:javascript简介   JavaScript是一种脚本语言,能实现网页内容的交互显示,当用户在客户端显示该网页时,浏览器就会执...

22580
来自专栏韩伟的专栏

框架设计原则和规范(二)

此文是《.NET:框架设计原则、规范》的读书笔记,本文内容较多,共分九章,将分4天进行推送,今天推送4-5章。 1. 什么是好的框架 2. 框架设计...

31250

扫码关注云+社区

领取腾讯云代金券