当前位置: 首页 > Web前端 > HTML5

HTML5类相关扩展

时间:2023-04-05 16:49:36 HTML5

对于传统的HTML,HTML5是一场叛乱。之前的所有版本都对JavaScript接口进行了三言两语的描述,主要空间用于定义标签,所有与JavaScript相关的内容都留给DOM规范来定义。HTML5规范围绕如何使用新标签定义了大量JavaScriptAPI。其中一些API与DOM重叠,定义了浏览器应支持的DOM扩展。Class相关的扩展HTML4在web开发领域被广泛采用后,导致了一个很大的变化,那就是class属性的使用越来越多。一方面可以用来给元素添加样式,另一方面也可以用来表达元素的语义。因此,自然会有大量的JavaScript代码来操作CSS类,例如动态修改类或在文档中搜索具有给定类或给定类集的元素等等。为了让开发者适应并增加对class属性的新理解,HTML5增加了很多专门用于简化CSS类使用的API。getElementsByClassName()方法HTML5新增的getElementsByClassName()方法是最流行的方法,可以通过文档对象和所有HTML元素调用。该方法最早出现在JavaScript库中,通过已有的DOM函数实现,而原生实现具有很大的性能优势。getElementsByClassName()方法接受一个参数,一个包含一个或多个类名的字符串,并返回一个包含指定类的所有元素的NodeList。当传入多个类名时,类名的顺序并不重要。看看下面的例子。//获取类中所有包含“username”和“current”的元素,类名顺序无所谓varallCurrentUsernames=document.getElementsByClassName("usernamecurrent");//获取ID为"的元素myDiv”,其中包含名为“selected”的所有元素varselected=document.getElementById("myDiv").getElementsByClassName("selected");调用此方法时,只会返回调用元素的子树中的元素。在文档对象上调用getElementsByClassName()将始终返回与类名匹配的所有元素,在元素上调用该方法将仅返回后代元素中的匹配元素。使用此方法可以更轻松地为具有特定类的元素添加事件处理程序,因此您不再局限于使用ID或标记名称。但不要忘记,由于返回的对象是NodeList,因此使用此方法与使用getElementsByTagName()和其他返回NodeList的DOM方法具有相同的性能问题。支持getElementsByClassName()方法的浏览器有IE9+、Firefox3+、Safari3.1+、Chrome和Opera9.5+。classList属性在操作类名时需要通过className属性来增删改换类名。因为className是一个字符串,即使只修改了字符串的一部分,每次也必须设置整个字符串的值。例如,以下面的HTML代码为例。

这个
元素一共有三个类名。要从中删除一个类名,你需要把三个类名分开,删除一个你不想要的,剩下的一起放在一个新的字符串中。请看下面的例子。//删除“用户”类//首先获取类名字符串,拆分成数组varclassNames=div.className.split(/\s+/);//找到要删除的类名varpos=-1,我,长度;对于(i=0,len=classNames.length;i元素的类属性中删除“用户”,需要上述所有代码。需要通过类似的算法替换类名,并确认类名是否包含在元素中。添加类名可以通过拼接字符串来完成,但是必须检查以确保不会多次添加相同的类名。许多JavaScript库实现了这个方法来简化这些操作。HTML5增加了一种操作类名的方法,可以使操作更简单、更安全,那就是给所有元素添加classList属性。classList属性是新集合类型DOMTokenList的一个实例。与其他DOM集合类似,DOMTokenList有一个length属性,表示它包含多少个元素,要获取每个元素,可以使用item()方法,也可以使用方括号语法。此外,这个新类型定义了以下方法。add(value):将给定的字符串值添加到列表中。如果该值已存在,则不会添加。contains(value):表示给定值是否存在于列表中,存在则返回true,否则返回false。remove(value):从列表中删除给定的字符串。toggle(value):如果给定的值已经存在于列表中,则删除它;如果给定值不在列表中,则添加它。这样,前面的几行代码就可以换成下面这行代码了:div.classList.remove("user");上面的代码可以保证其他的类名不会因为这个修改而受到影响。其他方法可以大大降低类似基本操作的复杂性,如下例所示。//删除“禁用”类div.classList.remove(“禁用”);//添加“当前”类div.classList.add(“当前”);//切换“用户”类div.classList.toggle("user”);//判断元素是否包含给定的类名if(div.classList.contains(“bd”)&&!div.classList.contains(“disabled”)){//执行操作)//迭代类namefor(vari=0,len=div.classList.length;i