首頁  >  文章  >  web前端  >  TreeWalker:DOM 遍歷實用指南

TreeWalker:DOM 遍歷實用指南

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-23 01:02:11621瀏覽

最近我開始利用空閒時間開發一個新的 Chrome 擴展,在研究如何處理一些功能的過程中,我開始發現 JS 在處理 DOM 方面有越來越多的功能。頁。

考慮到絕大多數使用 JS 的人僅透過框架來使用它,這將成為一系列短文的一個有趣主題,讓人們更多地了解他們所依賴的框架的底層技術實際使用。

我們都經歷過這樣的情況 — 您需要在 DOM 中尋找特定元素,但 querySelector 和 getElementsBy* 並不能完全解決這個問題。也許您需要尋找包含特定短語的所有文字節點,或者您想要遍歷符合某些條件的元素,同時跳過其他條件。輸入 TreeWalker - 一個強大但經常被忽視的 DOM 遍歷 API。

什麼是樹行者?

TreeWalker 是一個 DOM 接口,可讓您有效率地遍歷和過濾 DOM 節點。將其視為 querySelector 等方法的更強大、更靈活的替代方法。 querySelector 為您提供與 CSS 選擇器相符的元素,而 TreeWalker 可以讓您:

  • 在任何方向上導航 DOM 樹(向前、向後、向上、向下)
  • 依自訂條件過濾節點
  • 完全跳過樹的某些部分
  • 直接存取文字節點(querySelector 無法做到)

創建樹行者

讓我們從一個基本範例開始:

const walker = document.createTreeWalker(
    document.body, // Root node to start traversal
    NodeFilter.SHOW_TEXT, // Only show text nodes
    {
        acceptNode: function(node) {
            // Only accept text nodes that aren't empty
            return node.textContent.trim().length > 0
                ? NodeFilter.FILTER_ACCEPT
                : NodeFilter.FILTER_REJECT;
        }
    }
);

這三個參數是:

  1. 根節點-從哪裡開始遍歷
  2. 要顯示什麼類型的節點(文字、元素、註解等)
  3. 決定接受或拒絕哪些節點的濾波函數

現實世界的例子

1. 尋找並取代文本

這是您實際使用的東西 - 尋找和替換文本,同時保留 HTML 結構。

function replaceText(root, search, replace) {
    const walker = document.createTreeWalker(
        root,
        NodeFilter.SHOW_TEXT,
        {
            acceptNode: function(node) {
                return node.textContent.includes(search)
                    ? NodeFilter.FILTER_ACCEPT
                    : NodeFilter.FILTER_REJECT;
            }
        }
    );

    let node;
    while (node = walker.nextNode()) {
        node.textContent = node.textContent.replace(search, replace);
    }
}

// Usage
replaceText(document.body, 'old text', 'new text');

這比使用innerHTML 高效得多,並且不會破壞事件偵聽器或表單輸入值。

2. 自訂DOM查詢

需要找出符合複雜條件的元素? TreeWalker 可以滿足您的需求。讓我們建立一些更複雜的東西 - 假設您需要找到所有 包含特定文字的元素,但前提是它們位於

內具有特定類別的元素,並忽略

以上是TreeWalker:DOM 遍歷實用指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn