摘要:級遍歷和范圍模塊定義了兩個用于輔助完成順序遍歷結(jié)構(gòu)的類型和這兩個類型能夠基于給定的起點對結(jié)構(gòu)執(zhí)行深度優(yōu)先的遍歷操作。其中的屬性,表示任何遍歷方法在上一次遍歷中返回的接待你。通過設(shè)置這個屬性也可以修改遍歷繼續(xù)進行的節(jié)點。
“DOM2級遍歷和范圍”模塊定義了兩個用于輔助完成順序遍歷DOM結(jié)構(gòu)的類型:NodeIterator和TreeWalker;這兩個類型能夠基于給定的起點對DOM結(jié)構(gòu)執(zhí)行深度優(yōu)先的遍歷操作。
NodeIterator類型 使用document.createNodeIterator()方法創(chuàng)建新的實例。這個方法接收四個參數(shù):root:想要作為搜索起點的樹中的節(jié)點;
whatToShow:表示要訪問哪些節(jié)點的數(shù)字代碼;
filter:是一個NodeFilter對象,或者一個函數(shù)(表示應(yīng)該接受還是拒絕某種特定節(jié)點的函數(shù));
entityReferenceExpansion:布爾值,表示是否擴展實體引用。在HTML頁面中沒用;
whatToShow:NodeFilter.SHOW_ALL:所有類型節(jié)點;
NodeFilter.SHOW_ELEMENT:元素;
NodeFilter.SHOW_ATTRIBUTE:特性;
NodeFilter.SHOW_TEXT:文本;
NodeFilter.SHOW_COMMENT;
NodeFilter.SHOW_DOCUMENT;
NodeFilter.SHOW_DOCUMENT_TYPE;
另外還有對HTML頁面沒用的幾個:
NodeFilter.SHOW_CDATA_SECTION;
NodeFilter.SHOW_ENTITY_REFERENCE:實體引用節(jié)點;
NodeFilter.SHOW_ENTITY:實體節(jié)點;
NodeFilter.SHOW_PROCESSING_INSTRUCTION:處理指令節(jié)點;
NodeFilter.SHOW_DOCUMENT_FRAGMENT;
NodeFilter.SHOW_NOTATION:符號節(jié)點
可以用按位或操作符來組合多個選項如:
var whatToShow = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT;filter
可以使用createNodeIterator()方法的filter參數(shù)來指定自定義的NodeFilter對象,每個NodeFilter對象只有一個方法,應(yīng)該訪問的節(jié)點返回NodeFilter.FILTER_ACCEPT;不應(yīng)該訪問的節(jié)點返回NodeFilter.FILTER_SKIP;
可以創(chuàng)建包含acceptNode()方法的對象:
var filter = { acceptNode: function(node) { return node.nodeName.toLowerCase() == "p" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } };
也可以創(chuàng)建一個與acceptNode()方法類似的函數(shù):
var filter = function(node) { return node.nodeName.toLowerCase() == "p" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; }
如果不指定過濾器,那么應(yīng)該傳入null。
舉例: 搜索document中所有的元素var iterator = document.createNodeIterator(document.body, NodeFilter.SHOW_ELEMENT, null); var node = iterator.nextNode(); console.log(node); //HTMLBodyElement搜索document中所有的p元素
var filter = { acceptNode: function(node) { return node.nodeName.toLowerCase() == "p" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } }; var iterator = document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, filter); var node = iterator.nextNode(); console.log(node); //HTMLParagraphElement搜索document中所有的h1元素
var filter = function(node) { return node.nodeName.toLowerCase() == "h1" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; } var iterator = document.createNodeIterator(document.body, NodeFilter.SHOW_ALL, filter); var node = iterator.nextNode(); console.log(node); //HTMLHeadingElementnextNode()方法與previousNode()方法
前者用于向前前進一步;后者用于向后后退一步。當(dāng)遍歷到DOM子樹的最后一個節(jié)點時,nextNode()返回null;當(dāng)遍歷到DOM子樹的最后一個節(jié)點,且previousNode()返回根節(jié)點以后,再次調(diào)用它就會返回null。
舉例:以下面的html代碼為例:
遍歷div元素中所有的節(jié)點Hello world!
- List item 1
- List item 2
- List item 3
var div = document.getElementById("div1"); var iterator = document.createNodeIterator(div, NodeFilter.SHOW_ELEMENT, null, false); var node = iterator.nextNode(); while(node !== null){ console.log(node.nodeName); //輸出標(biāo)簽名 node = iterator.nextNode(); } // [L] repetition.html:24 DIV // [L] repetition.html:24 P // [L] repetition.html:24 B // [L] repetition.html:24 UL // [L] repetition.html:24 LI // [L] repetition.html:24 LI // [L] repetition.html:24 LI遍歷div中所有的li元素中的文本
var div = document.getElementById("div1"); var filter = function(node) { if (node.nodeName.toLowerCase() == "li") { return NodeFilter.FILTER_ACCEPT; } else { return NodeFilter.FILTER_SKIP; } }; var iterator = document.createNodeIterator(div, NodeFilter.SHOW_ELEMENT, filter, false); var node = iterator.nextNode(); while (node !== null) { console.log(node.firstChild.nodeValue); node = iterator.nextNode(); } // [L] repetition.html:31 List item 1 // [L] repetition.html:31 List item 2 // [L] repetition.html:31 List item 3TreeWalker類型
這個類型比上面那個更高級,除了包括nextNode()和previousNode()在內(nèi)的相同的功能之外,這個類型還提供了下列用于在不同方向上遍歷DOM結(jié)構(gòu)的方法。如:
parentNode():遍歷到當(dāng)前節(jié)點的父節(jié)點;
firstChild():...第一個子節(jié)點;
lastChild():...最后一個子節(jié)點;
nextSibling():...當(dāng)前節(jié)點的下一個同輩節(jié)點;
previousSibling():...當(dāng)前節(jié)點的上一個同輩節(jié)點;
createTreeWalker()方法該方法用于創(chuàng)建TreeWalker對象,document.createTreeWalker()方法接收4個參數(shù),與document.createNodeIterator()方法一致。其中的currentNode屬性,表示任何遍歷方法在上一次遍歷中返回的接待你。通過設(shè)置這個屬性也可以修改遍歷繼續(xù)進行的節(jié)點。如:
var div = document.getElementById("div1"); var walker = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, null, false); var node = walker.currentNode; //currentNode返回當(dāng)前節(jié)點 Div console.log(node.nodeName); //DIV walker.currentNode = document.getElementsByTagName("li")[0]; node = walker.currentNode; console.log(node.firstChild.nodeValue); //List item 1 var secLiElem = walker.nextSibling(); console.log(secLiElem.firstChild.nodeValue); //List item 2舉例:
以下面的html代碼為例:
遍歷div元素中所有的節(jié)點Hello world!
- List item 1
- List item 2
- List item 3
var div = document.getElementById("div1"); var walker = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, null, false); var node = walker.nextNode(); while(node !== null){ console.log(node.nodeName); node = walker.nextNode(); } // [L] repetition.html:24 P // [L] repetition.html:24 B // [L] repetition.html:24 UL // [L] repetition.html:24 LI // [L] repetition.html:24 LI // [L] repetition.html:24 LI遍歷div元素中所有的li元素中文本
var div = document.getElementById("div1"); var walker = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, null, false); var node = walker.currentNode; //currentNode返回當(dāng)前節(jié)點 Div walker.firstChild(); //轉(zhuǎn)到p walker.nextSibling(); //轉(zhuǎn)到ul node = walker.firstChild(); //轉(zhuǎn)到li while(node !== null){ console.log(node.firstChild.nodeValue); node = walker.nextNode(); } // [L] repetition.html:27 List item 1 // [L] repetition.html:27 List item 2 // [L] repetition.html:27 List item 3
由于IE中沒有對應(yīng)的類型和方法,所以使用遍歷的夸瀏覽器解決方案非常少見。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78386.html
摘要:和級分為許多模塊,分別描述了的某個非常具體的子集。這些模塊主要有核心視圖事件樣式遍歷和范圍以及。另外還有方法和方法框架的變化框架和內(nèi)嵌框架分別用和表示,它們在級中都有一個新屬性這個屬性包含一個指針,指向表示框架內(nèi)容的文檔對象。 DOM2和DOM3級分為許多模塊,分別描述了DOM的某個非常具體的子集。這些模塊主要有核心(Core)、視圖(Views)、事件(Events)、樣式(Styl...
摘要:級遍歷和范圍模塊定義了范圍接口。折疊范圍方法折疊就是指范圍中未選擇文檔的任何部分。表示折疊到范圍的起點,參數(shù)表示折疊到范圍的終點。常量指定比較當(dāng)前范圍的點和指定范圍的點。下節(jié)再討論及更早版本中的范圍 DOM2級遍歷和范圍模塊定義了范圍接口。通過范圍可以選擇文檔中的一個區(qū)域,而不必考慮節(jié)點的界限(選擇在后臺完成,對用戶是不可見的)。 DOM中的范圍 DOM2級在Document類型中定義...
摘要:如計算的樣式方法和屬性前者是增強了,這個方法接收兩個參數(shù)計算樣式的元素以及一個偽元素字符串如。操作表樣式類型表示的是樣式表,包括元素包含的樣式表和在元素中定義的樣式表。 層次:訪問style對象: style對象是CSSStyleDeclaration的實例; getComputedStyle方法也返回CSSStyleDeclaration的實例; 訪問樣式表: 元素包含的樣式表...
摘要:如計算的樣式方法和屬性前者是增強了,這個方法接收兩個參數(shù)計算樣式的元素以及一個偽元素字符串如。操作表樣式類型表示的是樣式表,包括元素包含的樣式表和在元素中定義的樣式表。 層次:訪問style對象: style對象是CSSStyleDeclaration的實例; getComputedStyle方法也返回CSSStyleDeclaration的實例; 訪問樣式表: 元素包含的樣式表...
摘要:擴展選擇符的核心是兩個方法和。目前已完全支持的瀏覽器有和。在寫模式下,會根據(jù)指定的字符串創(chuàng)建新的子樹,然后用這個子樹完全替換調(diào)用元素。在刪除帶有事件處理程序或引用了其他對象子樹時,就有可能導(dǎo)致內(nèi)存占用問題。刪除集合中指定位置的規(guī)則。 DOM擴展 選擇符API Selectors API Level 1 的核心是兩個方法:querySelector()和querySelectorAll(...
閱讀 2496·2021-11-24 09:39
閱讀 3420·2021-11-15 11:37
閱讀 2270·2021-10-08 10:04
閱讀 3981·2021-09-09 11:54
閱讀 1894·2021-08-18 10:24
閱讀 1064·2019-08-30 11:02
閱讀 1808·2019-08-29 18:45
閱讀 1664·2019-08-29 16:33