最近、私は自由時間に新しい Chrome 拡張機能の開発に取り組み始めました。いくつかの機能を処理する方法を研究する中で、JS が DOM を処理する際に持つ機能をますます発見し始めました。ページ。
JS を使用している圧倒的な数の人がフレームワークを通じてのみ 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;
}
}
);
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 があなたをサポートします。もっと複雑なものを構築しましょう。すべての を見つける必要があるとします。特定のテキストを含む要素。ただし、それらが 内にある場合に限ります。
声明:この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。