DOM2与DOM3的特性
DOM 2 和 DOM 3 在之前提过,是一系列各种功能的模块用于增强DOM,可以通过测试函数document.implementation.hasFeature()
来测试浏览器是否支持DOM 2 和 3。
DOM2 和 DOM3的特性主要集中在对样式的方便访问,更强的遍历功能与自定义遍历器,范围控制等几个要素。
样式
为了改变页面的效果,对HTML元素的样式操作非常频繁。DOM2级样式提供了一系列便捷的API用于直接操作一个元素节点的样式。操作style对象
所有支持style的HTML元素都有.style属性,这个属性返回一个对象,包含所有CSS属性的键值对。这个对象就像JS对象一样可以继续用.attrName来访问具体值。如果CSS元素有减号连接,则要转换成驼峰形式。特别的是针对float属性要用.cssFLoat 除了CSS属性名之外,style取得的CSS对象还有一些方法和属性:属性或方法 | 解释 |
---|---|
.cssText | 获得全部的CSS代码,如果重新设置的话,会覆盖原来的所有CSS代码 |
.length | CSS属性的数量 |
.parentRule | CSS信息的CSSRule对象 |
.getPropertyValue(attrName) | 参数是CSS属性名,用于获得对应的属性值。这里的参数是CSS原始的属性名称,不是驼峰 |
.getPropertyPriority(attrName) | 如果样式用了!important设置,则返回"!important",否则返回空字符串。 |
.item(index) | 返回给定索引位置的CSS属性名。 |
.removeProperty(attrName) | 删除某个CSS属性 |
.setProperty(attrName, value, important) | 设置CSS属性,最后一个参数如果强制生效,就传入"!important",否则传入空字符串。 |
document.defaultView.getComputedStyle('element',伪类或空字符串)
第二个参数可以是一个伪类字符串,如果不需要伪类,可以传一个空字符串。这个参数的结果是只读的,不可设置。
恢复默认值
如果在CSS中定义了对应的样式,通过JS修改了样式,那么将属性赋予一个空字符串表示是恢复默认效果,而不是将其值设置为空。可以理解为JS是最靠近用户的一层,修改的样式最优先,当JS的样式被设置为空的时候,就按照原来的CSS文件展现样式。操作stylesheet样式表对象
在之前的操作.style属性只是内联样式,在HTML页面中,样式表是在head标签的link标签内定义的,DOM 2级为样式表准备了一个API是document.styleSheets
这个属性返回一个StyleSheetList,里边包含了所有作用于该页面的样式表,其中的head标签内的一个Link标签算一个,head内部的一对style标签也算一个。
需要操作某一个样式表,可以用方括号索引或者.item(index)取出想要操作的CSSStyleSheet样式表对象,对于样式表对象有共通的方法和属性:
属性或方法 | 解释 |
---|---|
.disabled | 表示样式是否被禁用,设置为true表示禁用 |
.href | 如果这个样式表是通过外链而来,这个返回URL地址。否则是null |
.media | 当前样式表支持的所有媒体类型的集合 |
.parentStyleSheet | 如果当前样式表是通过@import导入的,就返回导入它的样式表,否则返回null |
.ownerNode | 返回拥有当前样式表的节点,比如通过link标签引入的样式表就返回link标签。 |
.title | ownerNode中title属性的值。 |
.type | 表示样式表类型的字符串,对CSS样式表而言是type/css |
遍历
DOM 2级定义了两个类型:NodeIterator 和 TreeWalker,用于对给定的起点进行深度优先的遍历操作。NodeIterator
NodeIterator是一个类,需要用document.createNodeIterator(root,whatToShow,filter,boolean)
来生成一个实例然后对实例进行操作。
第一个参数表示起点,是一个节点对象;第二个参数表示过滤器的代码,用于确定哪些节点要访问;第三个参数是自定义的对象,必须有一个.acceptNode()方法,返回布尔值,以确定接受还是拒绝这个节点,第四个参数在HTML里无用。
生成一个实例之后,就是一个自定义的迭代器,然后用nextNode()和previousNode()
来前进后后退,所谓前进就是下一个节点,后退就是上一个节点,方法返回节点对象。
TreeWalker
这个也是一个类,需要用document.createTreeWalker()
来建立实例,四个参数与NodeIterator完全相同。
这两个遍历器比较灵活,遇到的时候可以再深度研究。
范围
所谓范围,就是可以选择文档的一个部分,不必考虑节点的界限。方便对某一部分进行操作。 要创建一个范围,需要用document.createRange()
来创建一个范围实例。这个范围有很多属性和方法,但是在创建的时候这个范围不包括任何文档内容,这些属性和方法也没有生效。需要在文档中使用范围对象的.selectNode(node) 和 .selectNodeContent(node)
方法来选择一个节点来设置范围。第一个方法是将参数节点及其全部内容和后代纳入范围内,第二个方法是只将参数节点的子节点纳入范围内。
范围的部分在遇到的时候也可以再看。