DOM2级和3级的目的在于扩展DOM API,以知足操做XML的全部需求,同时提供更好的错误处理及特性检测能力。从某种意义上讲,实现这一目的的很大程度意味着对命名空间的支持。css
var supportsDOM2Core = document.implementation.hasFeature('Core', '2.0');
var supportsDOM3Core = document.implementation.hasFeature('Core', '3.0');
var supportsDOM2HTML = document.implementation.hasFeature('HTML', '2.0')
var supportsDOM2Views = document.implementation.hasFeature('Views', '2.0');
var supportsDOM2XML = document.implementation.hasFeature('XML', '2.0')
复制代码
有了XML命名空间,不一样XML文档的元素就能够混合一块儿,共同构成格式良好的文档,而没必要担忧发生命名冲突。html
命名空间要使用xmlns特性来指定。node
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<title>Example XHTML page</title>
</head>
<body>
Hello world!
</body>
</html>
复制代码
在DOM2级中,Node类型包含下列特定于命名空间的属性。编程
DOM的其余部分在‘DOM2级核心’中也发生了一些变化。这些变化与XML命名空间无关,而是更倾向于确保API的可靠性及完整性。浏览器
新增了3个属性:publicId、systemId和internalSubset。bash
Document类型的变化中惟一与命名空间无关的方法是importNode()。app
须要注意的是,每一个节点都有一个ownerDocument属性,表示所属的文档。若是调用appendChild()时传入的节点属于不一样的文档(ownerDocument属性的值不同),则会致使错误。但在调用importNode()时传入不一样文档的节点则会返回一个新节点,这个新节点的全部权归当前文档全部。框架
importNode()方法与Element的cloneNode()方法很是相似,它接受两个参数:要复制的节点和一个表示是否复制子节点的布尔值。
返回的结果是原来节点的副本,但可以在当前文件中使用。函数
var newNode = document.importNode(oldNode, true); //导入节点及其子节点
document.body.appendChild(newNode);
复制代码
Node类型中惟一与命名空间无关的变化,就是添加了isSupported()方法。与DOM1级为document.implementation引入的hasFeature()方法相似,isSupported()方法用于肯定当前节点具备什么能力。ui
DOM3级引入了两个辅助比较节点的方法:isSameNode()和isEqualNode()。 这两个方法都接受一个节点参数,并在传入节点与引用的节点相同或相等时返回true。
所谓相同,指的是两个节点引用的是同一个对象。
所谓相等,指的是两个节点是相同的类型,具备相等的属性(nodeName、nodeValue),并且它们的attributes和childNodes属性也相等。
var div1 = document.createElement('div');
div1.setAttribute('class', 'box');
var div2 = docuemnt.createElement('div');
div2.setAttribute('class', 'box');
div1.isSameNode(div1); // true
div1.isSameNode(div2); // false
div1.isEqualNode(div2); // true
复制代码
略
在HTML中定义样式的方式有3种:经过<link/>
元素包含外部样式表文件、使用<style/>
元素定义嵌入式样式,以及使用style特性定义针对特定元素的样式。
DOM2级样式模块围绕这3种应用样式的机制提供了一套API。
任何支持style特性的HTML元素在JavaScript中都有一个对应的style属性。这个style对象是CSSStyleDeclaration的实例,包含着经过HTML的style特性指定的全部样式信息,但不包含与外部样式表或嵌入样式表经层叠而来的样式。
对于短划线的CSS属性名,必须将其转换成驼峰大小写形式,才能经过JavaScript访问。
其中一个不能直接转换的CSS属性就是float。因为float是JavaScript中的保留字,所以不能用做属性名。规定对应的属性名是cssFloat。而IE中则是styleFloat。
DOM2级样式规范还为style对象定义了一些属性和方法。这些属性和方法在提供元素的style特性值的同时,也能够修改样式。下面列出了这些属性和方法。
设置cssText是为元素应用多项变化最快捷的方式:
myDiv.style.cssText = 'width: 25px; height: 100px'
复制代码
迭代CSS属性:
var prop, value, i, len;
for (i = 0; len = myDiv.style.length; i < len; i++) {
prop = myDiv.style[i]; //或者 myDiv.style.item(i)
value = myDiv.style.getPropertyValue(prop);
console.log(prop + ' : ' + value)
}
复制代码
getComputedStyle()方法。这个方法接受两个参数:要取得计算样式的元素和一个伪元素字符串。若是不须要伪元素信息,第二个参数能够是null。
var myDiv = document.getElementById('myDiv');
var computedStyle = myDiv.computedStyle // IE环境下 myDiv.currentStyle
复制代码
这个属性是CSSStyleDeclaration的实例。
CSSStyleSheet对象是一套只读的接口(有一个属性例外)。使用下面的代码能够肯定浏览器是否支持DOM2级样式表。
var supportDOM2StyleSheets = dcoument.implementation.hasFeature('StyleSheets', '2.0');
复制代码
CSSStyleSheet继承自StyleSheet,后者能够做为一个基础接口来定义非CSS样式表。从StyleSheet接口继承而来的属性以下。
<link>
或<style/>
引入的。若是当前样式表是其余样式表经过@import导入的,则这个属性值为null。IE不支持这个属性。应用于文档的全部样式表是经过document.styleSheets集合来表示的。
var sheet = null;
for (var i = 0, len = document.styleSheets.length; i < len; i++) {
sheet = document.styleSheets[i];
console.log(sheet.href)
}
复制代码
offset dimension,包括元素在屏幕上占用的全部可见的空间。经过下面四个属性能够取得元素的偏移量。
其中offsetLeft和offsetTop属性与包含元素有关,包含元素的引用保存在offsetParent属性中。offsetParent属性不必定与parentNode的值相等。例如,元素的offsetParent是做为其祖先元素的
元素,由于最近的一个具备大小的元素。 function getElementOffsetLeft (element) {
var currentLeft = element.offsetLeft;
var parent = element.offsetParent;
while (parent) {
currentLeft += parent.offsetLeft;
parent = parent.offsetParent;
}
return currentLeft;
}
同理 // top
复制代码 客户区大小 client dimension是指元素内容及其内边距所占据的空间大小(content + padding)。 clientWidth属性是元素内容区宽度加上左右内边距宽度;clientHeight属性是元素内容区高度加上上下内边距高度。 常见用法:肯定浏览器视口大小。 function getViewport () {
if (document.compatMode == 'BackCompat') {
return {
width: document.body.clientWidth,
height: document.body.clientHeight
}
} else {
return {
width: document.documentElement.clentWidth,
height: document.documentElement.clientHeight
}
}
}
复制代码 滚动大小(scroll dimension)指的是包含滚动内容的元素的大小。 4个与滚动大小相关的属性:
由于浏览器兼容性的问题,在肯定文档的总高度时,必须取得scrollWidth/clientWidth和scrollHeight/clientHeight中的最大值,才能保证在跨浏览器时获得精确的结果。 var docHeight = Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight);
var docWidth = Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth);
复制代码 遍历DOM2级遍历和范围模块定义了两个用于辅助完成顺序遍历DOM结构的类型:NodeIterator和TreeWalker var supportTraversals = document.implementation.hasFeature('Traversal', '2.0');
var supportNodeIterators = (typeof document.createNodeIterator == 'function');
var supportTreeWalker = (typeof document.createTreeWaler == 'function')
复制代码 NodeIteratorNodeIterator类型是二者中比较简单的一个,可使用document.createNodeIterator()方法建立它的新实例。这个方法接受下列4个参数。
whatToShow参数是一个位掩码,经过应用一或多个filter来肯定要访问哪些节点。这个参数的值以常量形式在NodeFilter类型中定义。
除了NodeFilter.SHOW_ALL以外,可使用按位或操做符来组合多个选项: var whatToShow = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT;
复制代码 能够经过createNodeIterator()方法的filter参数来指定自定义的NodeFilter对象,或者指定一个功能相似节点过滤器(node filter)的函数。 每一个NodeFilter对象只有一个方法,即accept-Node();若是应该访问给定的节点,该方法返回 var filter = {
acceptNode: function (node) {
return node.tagName.toLowerCase() == 'p' ?
NodeFilter.FILTER_ACCEPT :
NodeFilter.FILTER_SKIP;
}
};
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT, filter, false);
复制代码 第三个参数也能够是一个与acceptNode()方法相似的函数,以下所示。 var filter = function (node) {
return node.tagName.toLowerCase() == 'p' ?
NodeFilter.FILTER_ACCEPT :
NodeFilter.FILTER_SKIP;
};
var iterator = document.createNodeIterator(root, NodeFilter.SHOW_ELEMENT, filter, false);
复制代码 若是不指定过滤器,那么应该在第三个参数的位置上传入null。 NodeIterator类型的两个主要方法是nextNode()和previousNode()。在刚刚建立的NodeIterator对象中,有一个内部指针指向根节点,所以第一次调用nextNode()会返回根节点。 TreeWalkerTreeWalker是NodeIterator的一个更高级的版本。除了包括nextNode()和previousNode()在内的相同的功能以外,这个类型还提供了下列用于在不一样方向上遍历DOM结构的方法。
范围为了让开发人员更方便地控制页面,“DOM2级遍历和范围”模块定义了“范围”(range)接口。经过范围能够选择文档中的一个区域,而没必要考虑节点的界限。 DOM中的范围DOM2级在Document类型中定义了createRange()方法。在兼容DOM的浏览器中,这个方法属于document对象。 var supportsRange = document.implementation.hasFeature('Range', '2.0');
var supportsRange2 = (typeof document.createRange == 'function');
复制代码 若是浏览器支持范围,那么就可使用createRange()来建立DOM范围。 var range = document.createRange();
复制代码 与节点相似,新建立的范围也直接与建立它的文档关联在一块儿,不能用于其余文档。 IE8及更早版本中的范围小结DOM2级规范定义了一些模块,用于加强DOM1级
|