HTML5新特性:元素的classList属性与应用

在html5新增的classList之前, 操作元素的class用的是className这个属性,而如果要向jquery封装的hasClass, removeClass, addClass, toggleClass一样优雅的操作calssName, 在以前我们要对className封装处理,如下, 下面的代码你未必能看得懂运行流程,但应该能看懂功能部分,这几段函数是取自我录制的一套视频中,讲解DOM框架封装的一部分

gQuery.prototype.hasClass = function (obj, cName) {
    // <div class="abc"> <div class="hello abc def"></div> <div class="hello def abc"></div>
    return obj.className.match(new RegExp(‘(\\s|^)‘ + cName + ‘(\\s|$)‘));
}
gQuery.prototype.addClass = function (cName) {
    for (var i = 0; i < this.elements.length; i++) {
        if (!this.hasClass(this.elements[i], cName)) {
            // hello abc   // abc
            this.elements[i].className += " " + cName;
            this.elements[i].className = this.trim(this.elements[i].className);
        }
    }
    return this;
}
gQuery.prototype.removeClass = function (cName) {
    for (var i = 0; i < this.elements.length; i++) {
        if (this.hasClass(this.elements[i], cName)) {
            var re = new RegExp(‘(\\s|^)‘ + cName + ‘(\\s|$)‘);
            this.elements[i].className = this.elements[i].className.replace(re, " ");
            this.elements[i].className = this.trim(this.elements[i].className);
        }
    }
    return this;
}
gQuery.prototype.toggleClass = function (cName) {
    for (var i = 0; i < this.elements.length; i++) {
        if (this.hasClass(this.elements[i], cName)) {
            this.removeClass(cName);
        } else {
            this.addClass(cName);
        }
    }
    return this;
}
这里,我还写了一个独立的删除某个class的功能:
<div class="box1 box2 box3">this is a test string</div>
    <input type="button" value="移除某个class">
    <script>
        var oDiv = document.querySelector("div"),
            classNames = ‘‘,
            oBtn = document.querySelector("input");
        oBtn.onclick = function(){
            classNames = oDiv.className.split(/\s+/);
            var pos = -1, i, len;
            for( i = 0, len = classNames.length; i < len; i++ ) {
                if( classNames[i] == ‘box2‘ ) {
                    pos = i;
                    break;
                }
            }
            classNames.splice( i, 1 );
            oDiv.className = classNames.join( " " );
        }

    </script>

思路非常的简单,获取div元素中的所有class, 用split 按空格切割,就会得到[box1,box2,box3]这样的数组, 然后遍历判断,是否有box2这个class?

找到之后就把当前数组的索引记下来,最后再用splice把该class从数组删除得到[box1,box3] 然后把数组的每一项用join函数中的空格连接,再赋值

给元素的className.

而在html5中,每个元素都有classList这个属性, classList是一个类数组结构, 提供了4个操作class的方法: add,remove,toggle,contains,

看到这几个英文单词,你已经知道什么意思了吧,尤其对于使用过jquery的朋友

add( 添加class),   remove( 删除class), toggle( 切换class) contains( 判断是否包含某个class )

<div id="box" class="box1 box2 box3">this is a test string</div>
    <input type="button" value="添加class" id="btn-add">
    <input type="button" value="移除class" id="btn-remove">
    <input type="button" value="切换class" id="btn-toggle">
    <script>
        var G = function (id) { return document.querySelector(id); }
        var oBtnAdd = G(‘#btn-add‘),
            oBtnRemove = G(‘#btn-remove‘),
            oBtnToggle = G(‘#btn-toggle‘),
            oBox = G(‘#box‘);
        oBtnAdd.onclick = function(){
            oBox.classList.add( ‘box4‘ );
        }
        oBtnRemove.onclick = function(){
            if( oBox.classList.contains(‘box1‘) ) {
                oBox.classList.remove( ‘box1‘ );
            }
        }
        oBtnToggle.onclick = function(){
            oBox.classList.toggle( ‘box4‘ );
        }
    </script>
时间: 2024-10-13 16:10:33

HTML5新特性:元素的classList属性与应用的相关文章

HTML5 & CSS3初学者指南(3) – HTML5新特性

介绍 本文介绍了 HTML5 的一些新特性.主要包含以下几个方面: Web 存储 地理位置 拖放 服务器发送事件 Web存储 HTML5 Web 存储的设计与构想是一个更好的机制来存储客户端的网络数据.它是通过一个网络浏览器作为客户端数据库实现的,它允许网页以键值对的形式来存储数据. 它具有以下特征: 每个原始网站/域最多可存储 5MB 的数据. 你可以通过属性和方法来使用 JavaScript 操作 web 存储器中的数据实现访问. 就像 cookies,你可以选择将保持数据(维持),即使你已

HTML5新特性新增功能

HTML5 现如今已经不是SGML的子集,主要是关于图像,位置,存储,多任务等功能的增加. 如:绘图canvas:用于媒介回放的video和audio元素:本地存储localStorage;语义化元素:表单控件等等新增的功能,都是HTML5新特性. 下面列举HTML5新特性详细说明: 一.新的文档类型  (New Doctype) 目前许多网页还在使用XHTML 1.0 并且要在第一行像这样声明文档类型: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1

HTML5新特性,老生常谈——前端面试常见问题

找工作面试的时候有公司技术人员会问html5新特性,那这里就再复习一遍 1.新的文档类型 <!DOCTYPE html> 2.脚本和链接无需type <link href="css/bootstrap.css" rel="stylesheet"> <script src="js/Angular.js"></script> 3.语义化的Header 和Footer 这里通俗说下什么叫做语义化,就是:明

HTML5实战与剖析之classList属性

classList属性究竟是干什么的,我们先撇下classList不管.我们考虑这么一个问题,那就是我们如何将拥有多个类名的元素中的其中一个类名删除呢?梦龙较劲脑汁儿终于想到一个实现的方法.将拥有类名li.meng和long,三个类名中的类名meng删除.代码如下 HTML代码 view source print? 1.<div class="li meng long">梦龙小站</div> JavaScript代码 view source print? 01.

HTML5新特性有哪些

HTML5新特性有哪些: 1.新的文档类型 2.脚本和链接无需 3.语义Header和Footer The Semantic Header and Footer 4.Hgroup 10.Autofocus 属性 Autofocus Attribute 12.Video 支持 Video Support 13.视频预载 Preload attribute in Videos element 14.显示控制条 15.正规表达式 5.标记元素 6.图形元素 8.占位符 9.必要属性

HTML5新特性data_*自定义属性使用

HTML5 新特性data_*自定义属性使用HTML5规范里增加了一个自定义data属性. 这个自定义data属性的用法非常的简单,就是你可以往 HTML 标签上添加任意以 "data-"开头的属性, 这些属性页面上是不显示的,它不会影响到你的页面布局和风格,但它却是可读可写的. 使用 data-* 可以解决自定义属性混乱无管理的现状.

HTML5 新模块元素兼容问题

新增块元素默认样式 下列HTML5新模块元素在IE8.9版本浏览器中没有被定义默认样式.为解决该问题,给下列元素添加“block”显示属性. 代码: article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } 特殊新增块元素 下列HTML5新模块元素在IE8.9版本浏览器中没有被定义默认样式,考虑到其特殊性,特为下列元素添加

HTML5新特性小结

HTML5 新特性 新的DocType: <!DOCTYPE html> 不需要声明文档类型: 脚本和链接不需要type属性,如 lingk, script; 语义化标签,如:header, footer, hgroup, mark, figure, small, article, 属性及校验, 新的属性,如:placeholder, required, autofocus, pattern, autocomplete, data, contenteditable 自动校验,如: requir

Html5新特性 &lt;canvas&gt;画板画直线

 下面例子为用canvas标签画多条直线 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht