最近我開始利用空閒時間開發一個新的 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. 尋找並取代文本
這是您實際使用的東西 - 尋找和替換文本,同時保留 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中文網其他相關文章!