成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript DOM2和DOM3——“遍歷”的注意要點

antz / 2287人閱讀

摘要:級遍歷和范圍模塊定義了兩個用于輔助完成順序遍歷結(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); //HTMLHeadingElement
nextNode()方法與previousNode()方法

前者用于向前前進一步;后者用于向后后退一步。當(dāng)遍歷到DOM子樹的最后一個節(jié)點時,nextNode()返回null;當(dāng)遍歷到DOM子樹的最后一個節(jié)點,且previousNode()返回根節(jié)點以后,再次調(diào)用它就會返回null。

舉例:

以下面的html代碼為例:

Hello world!

  • List item 1
  • List item 2
  • List item 3
遍歷div元素中所有的節(jié)點
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 3 
TreeWalker類型

這個類型比上面那個更高級,除了包括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代碼為例:

Hello world!

  • List item 1
  • List item 2
  • List item 3
遍歷div元素中所有的節(jié)點
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

相關(guān)文章

  • JavaScript DOM2DOM3——“DOM變化”注意要點

    摘要:和級分為許多模塊,分別描述了的某個非常具體的子集。這些模塊主要有核心視圖事件樣式遍歷和范圍以及。另外還有方法和方法框架的變化框架和內(nèi)嵌框架分別用和表示,它們在級中都有一個新屬性這個屬性包含一個指針,指向表示框架內(nèi)容的文檔對象。 DOM2和DOM3級分為許多模塊,分別描述了DOM的某個非常具體的子集。這些模塊主要有核心(Core)、視圖(Views)、事件(Events)、樣式(Styl...

    騫諱護 評論0 收藏0
  • JavaScript DOM2DOM3——“范圍”注意要點

    摘要:級遍歷和范圍模塊定義了范圍接口。折疊范圍方法折疊就是指范圍中未選擇文檔的任何部分。表示折疊到范圍的起點,參數(shù)表示折疊到范圍的終點。常量指定比較當(dāng)前范圍的點和指定范圍的點。下節(jié)再討論及更早版本中的范圍 DOM2級遍歷和范圍模塊定義了范圍接口。通過范圍可以選擇文檔中的一個區(qū)域,而不必考慮節(jié)點的界限(選擇在后臺完成,對用戶是不可見的)。 DOM中的范圍 DOM2級在Document類型中定義...

    happyhuangjinjin 評論0 收藏0
  • JavaScript DOM2DOM3——“樣式”注意要點

    摘要:如計算的樣式方法和屬性前者是增強了,這個方法接收兩個參數(shù)計算樣式的元素以及一個偽元素字符串如。操作表樣式類型表示的是樣式表,包括元素包含的樣式表和在元素中定義的樣式表。 層次:訪問style對象: style對象是CSSStyleDeclaration的實例; getComputedStyle方法也返回CSSStyleDeclaration的實例; 訪問樣式表: 元素包含的樣式表...

    whjin 評論0 收藏0
  • JavaScript DOM2DOM3——“樣式”注意要點

    摘要:如計算的樣式方法和屬性前者是增強了,這個方法接收兩個參數(shù)計算樣式的元素以及一個偽元素字符串如。操作表樣式類型表示的是樣式表,包括元素包含的樣式表和在元素中定義的樣式表。 層次:訪問style對象: style對象是CSSStyleDeclaration的實例; getComputedStyle方法也返回CSSStyleDeclaration的實例; 訪問樣式表: 元素包含的樣式表...

    Jason_Geng 評論0 收藏0
  • DOM擴展,DOM2DOM3

    摘要:擴展選擇符的核心是兩個方法和。目前已完全支持的瀏覽器有和。在寫模式下,會根據(jù)指定的字符串創(chuàng)建新的子樹,然后用這個子樹完全替換調(diào)用元素。在刪除帶有事件處理程序或引用了其他對象子樹時,就有可能導(dǎo)致內(nèi)存占用問題。刪除集合中指定位置的規(guī)則。 DOM擴展 選擇符API Selectors API Level 1 的核心是兩個方法:querySelector()和querySelectorAll(...

    suxier 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<