对于传统HTML而言,HTML5是一个叛逆。所有之前的版本对JavaScript接口的描述都不过三言两语,主要篇幅都用于定义标记,与JavaScript相关的内容一概交由DOM规范去定义。

而HTML5规范则围绕如何使用新增标记定义了大量JavaScript API。其中一些API与DOM重叠,定义了浏览器应该支持的DOM扩展。

与类相关的扩充

HTML4在Web开发领域得到广泛采用后导致了一个很大的变化,即 class 属性用得越来越多,一方面可以通过它为元素添加样式,另一方面还可以用它表示元素的语义。于是,自然就有很多JavaScript代码会来操作CSS类,比如动态修改类或者搜索文档中具有给定类或给定的一组类的元素,等等。为了让开发人员适应并增加对class 属性的新认识,HTML5新增了很多API,致力于简化CSS类的用法。

  1. getElementsByClassName() 方法

HTML5添加的 getElementsByClassName() 方法是最受人欢迎的一个方法,可以通过document 对象及所有HTML元素调用该方法。这个方法最早出现在JavaScript库中,是通过既有的DOM功能实现的,而原生的实现具有极大的性能优势。

getElementsByClassName() 方法接收一个参数,即一个包含一或多个类名的字符串,返回带有指定类的所有元素的 NodeList 。传入多个类名时,类名的先后顺序不重要。来看下面的例子。

  1. //取得所有类中包含“username”和“current”的元素,类名的先后顺序无所谓
  2. var allCurrentUsernames = document.getElementsByClassName(“username current”);
  3. //取得ID为“myDiv”的元素中带有类名“selected”的所有元素
  4. var selected = document.getElementById(“myDiv”).getElementsByClassName(“selected”);

调用这个方法时,只有位于调用元素子树中的元素才会返回。在 document 对象上调用 getElementsByClassName() 始终会返回与类名匹配的所有元素,在元素上调用该方法就只会返回后代元素中匹配的元素。

使用这个方法可以更方便地为带有某些类的元素添加事件处理程序,从而不必再局限于使用ID或标签名。不过别忘了,因为返回的对象是 NodeList ,所以使用这个方法与使用 getElementsByTagName() 以及其他返回 NodeList 的DOM方法都具有同样的性能问题。

支持 getElementsByClassName() 方法的浏览器有IE 9+、Firefox 3+、Safari 3.1+、Chrome和Opera 9.5+。

  1. classList 属性

在操作类名时,需要通过 className 属性添加、删除和替换类名。因为 className 中是一个字符串,所以即使只修改字符串一部分,也必须每次都设置整个字符串的值。比如,以下面的HTML代码为例。

  1. <div class=“bd user disabled></div>

这个 <div> 元素一共有三个类名。要从中删除一个类名,需要把这三个类名拆开,删除不想要的那个,然后再把其他类名拼成一个新字符串。请看下面的例子。

  1. //删除“user”类
  2. //首先,取得类名字符串并拆分成数组
  3. var classNames = div.className.split(/\s+/);
  4. //找到要删的类名
  5. var pos = -1,
  6. i,
  7. len;
  8. for (i=0, len=classNames.length; i < len; i++){
  9. if (classNames[i] == user”){
  10. pos = i;
  11. break;
  12. }
  13. }
  14. //删除类名
  15. classNames.splice(i,1);
  16. //把剩下的类名拼成字符串并重新设置
  17. div.className = classNames.join(“ ”);

为了从 <div> 元素的 class 属性中删除 “user” ,以上这些代码都是必需的。必须得通过类似的算法替换类名并确认元素中是否包含该类名。添加类名可以通过拼接字符串完成,但必须要通过检测确定不会多次添加相同的类名。很多JavaScript库都实现了这个方法,以简化这些操作。

HTML5新增了一种操作类名的方式,可以让操作更简单也更安全,那就是为所有元素添加 classList 属性。这个 classList 属性是新集合类型 DOMTokenList 的实例。与其他DOM集合类似, DOMTokenList 有一个表示自己包含多少元素的 length 属性,而要取得每个元素可以使用 item() 方法,也可以使用方括号语法。此外,这个新类型还定义如下方法。

  • add(value) :将给定的字符串值添加到列表中。如果值已经存在,就不添加了。
  • contains(value) :表示列表中是否存在给定的值,如果存在则返回 true ,否则返回 false 。
  • remove(value) :从列表中删除给定的字符串。
  • toggle(value) :如果列表中已经存在给定的值,删除它;如果列表中没有给定的值,添加它。

这样,前面那么多行代码用下面这一行代码就可以代替了:

  1. div.classList.remove(“user”);

以上代码能够确保其他类名不受此次修改的影响。其他方法也能极大地减少类似基本操作的复杂性,如下面的例子所示。

  1. //删除“disabled”类
  2. div.classList.remove(“disabled”);
  3. //添加“current”类
  4. div.classList.add(“current”);
  5. //切换“user”类
  6. div.classList.toggle(“user”);
  7. //确定元素中是否包含既定的类名
  8. if (div.classList.contains(“bd”) && !div.classList.contains(“disabled”)){
  9. //执行操作
  10. )
  11. //迭代类名
  12. for (var i=0, len=div.classList.length; i < len; i++){
  13. doSomething(div.classList[i]);
  14. }

有了 classList 属性,除非你需要全部删除所有类名,或者完全重写元素的 class 属性,否则也就用不到className 属性了。

支持 classList 属性的浏览器有Firefox 3.6+和Chrome。

链接

本文转载于猿2048:HTML5与类有关的扩充

HTML5与类有关的扩充的更多相关文章

  1. HTML5射击类游戏----【地球保卫战】

    在线DEMO地址:打开: 游戏截图:      就不贴代码了, 因为代码太多了, 大概写一下这个游戏实现思路和一些实现: 游戏一共有三关, 每一关都有一个大Boss, Boss比较好杀,主要各种外星飞 ...

  2. HTML5伪类选择器表单验证

    input : required   选择必填表单域 input : focus : invalid 选择当前聚焦的且含有非法输入值的表单域 input : focus : valid 选择当前聚焦的 ...

  3. DOM扩展-HTML5、专有扩展

     HTML5 与类相关的扩充 1.getElementsByClassName()方法 改方法接受一个参数,即一个包含一或多个类名的字符串,返回带有指定类的所有元素的NodeList.传入多个类型时, ...

  4. JS复习:第十、十一章

    第十章 NodeList是一种类数组对象,用于保存一组有序的节点,可以通过位置来访问这些节点,但它并不是Array实例,将其转化为数组的方法: function converToArray(nodes ...

  5. 你不知道的JavaScript--Item29 DOM基础详解

    看完JavaScript高级程序设计,整理了一下里面的DOM这一块的知识点,比较多,比较碎!DOM在整个页面的地位如图: DOM(文档对象模型)是针对HTML 和XML 文档的一个API(应用程序编程 ...

  6. 《JavaScript高级程序设计》笔记:DOM扩展(十一)

    选择符API querySelector()方法 // 取得body元素 var tbody = document.querySelector('body'); // 取得ID为"myDIV ...

  7. Javascript 高级程序设计--总结【四】

    *******************************  Chapter 11 DOM扩展  ******************************* 主要的扩展是 选择符API 和 H ...

  8. js学习笔记----JavaScript中DOM扩展的那些事

    什么都不说,先上总结的图~   Selectors API(选择符API) querySelector()方法 接收一个css选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回null ...

  9. 别真以为JavaScript中func.call/apply/bind是万能的!

    自从学会call/apply/bind这三个方法后我就各种场合各种使用各种得心应手至今还没踩过什么坑,怎么用?说直白点就是我自己的对象没有某个方法但别人有,我就可以通过call/apply/bind去 ...

随机推荐

  1. prometheus-数据展示之grafana部署和数据源配置

    1.监控pods .   prometheus再部署以后,会自带cAdvisor.结果如下: 2.K8S集群状态监控.需要使用kube-state-metrics插件.部署以后 kubernetes. ...

  2. pyqt(四)

    八.布局 1. 布局简介 一个pyqt窗口中可以有多个控件 所谓布局,指的就是多个控件在窗口中的展示方式 布局方式大致分为: 水平布局 竖直布局 网格布局 表单布局 2. 水平布局QHBoxLayou ...

  3. CNN(卷积神经网络)入门

    参考博文: 深度学习基础--卷积--1*1的卷积核与全连接的区别:https://blog.csdn.net/wydbyxr/article/details/84061410 如何理解卷积神经网络中的 ...

  4. 使用Dapper访问SQL Server数据库

    对应Demo程序名:DapperDemo 准备工作:为项目安装Dapper类库 方法一:项目中添加:项目名右键:Manage NuGet Packages:搜索Dappe:点击安装 方法二:在NuGe ...

  5. CF802O题解

    太厉害啦,出题人究竟是怎么想到的. 首先这题很显然可以使用费用流:对于 \(i \leq j\),连接一条边 \((i,j+n)\),流量为 \(1\),费用为 \(a_i+b_j\).最后连接 \( ...

  6. 理解 MVCC

    MongoDB.MySQL.Oracle.PostgreSQL 等事务型数据库都有 mvcc 的概念. MVCC: 即多版本并发控制,主要是为了提高数据库的读写性能,让数据库在读写的时候不用去加锁.m ...

  7. huawei 华为 ubuntu mysql 访问不了的原因

    标签:服务器   ins   查看   tar   安全组   service 一. 首先将3306端口添加至安全组, 确保端口没有被封掉 二. 开启服务器上的mysql 权限, 步骤如下 1.mys ...

  8. Wireshark OpenFlow解析器拒绝服务漏洞

    受影响系统:Wireshark Wireshark 2.2.0 - 2.2.1Wireshark Wireshark 2.0.0 - 2.0.7描述:CVE(CAN) ID: CVE-2016-937 ...

  9. Kettle错误记录之couldn't open file XXX

    业务背景: 简单的TXT文件入库逻辑 组件: 文件文本输入,表输出 具体BUG: 这里报错是无法打开文件,在我尝试了多个思路后,最终发现了问题所在. 因为使用的txt文件的格式是Unix的,而我的文本 ...

  10. RDMA--libibverbs代码分析(2)-设备发现

    基于上一篇文章https://www.cnblogs.com/xingmuxin/p/11057845.html 我们现在从分析libibverbs代码,跳入到分析内核代码,代码位置在./driver ...