回答編集履歴

2

Range.surroundContents() の手法を追記

2022/05/12 08:35

投稿

int32_t
int32_t

スコア20925

test CHANGED
@@ -19,5 +19,14 @@
19
19
 
20
20
  HTMLのソースを事前に変更できない場合は別の手段が必要で、けっこう面倒です。
21
21
  とくに、`<p>ほげ &lt;math>.. <span>.&lt;/math></span> ほげ</span></p>` のように開始地点と終了地点が別の要素に入っているケースもサポートするとかなり手間がかかります。
22
+ そうではない場合は、
23
+ [`TreeWalker`](https://developer.mozilla.org/ja/docs/Web/API/TreeWalker)などですべての`Text`ノードを先頭から処理し、
24
+ `Text`ノードの中からマークしたい文字列を検索、
25
+ マークしたい文字列の先頭の`Text`ノードとオフセットを記録、
26
+ マークしたい文字列の最後の`Text`ノードとオフセットを記録、
27
+ それらの情報で`Range`オブジェクトを作り、[`Range.surroundContents()`](https://developer.mozilla.org/en-US/docs/Web/API/Range/surroundContents) で `<mark>`で囲む
28
+
29
+ 以上で可能かと思います。
22
30
 
23
31
 
32
+

1

.

2022/05/11 06:19

投稿

int32_t
int32_t

スコア20925

test CHANGED
@@ -15,5 +15,9 @@
15
15
  </script>
16
16
  ```
17
17
 
18
+ ----
19
+
18
20
  HTMLのソースを事前に変更できない場合は別の手段が必要で、けっこう面倒です。
21
+ とくに、`<p>ほげ &lt;math>.. <span>.&lt;/math></span> ほげ</span></p>` のように開始地点と終了地点が別の要素に入っているケースもサポートするとかなり手間がかかります。
19
22
 
23
+