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級
|