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