🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Chrome extension

Chrome拡張機能

Q&A

解決済

2回答

1386閲覧

Chrome拡張機能開発で、JavascriptのDOMでhtmlの置換が出来ない。

tettyA

総合スコア93

DOM

DOMは、Document Object Modelの略で、HTML文書やXML文書をアプリケーションから利用するためのAPIです。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Chrome extension

Chrome拡張機能

0グッド

0クリップ

投稿2021/02/26 13:29

編集2021/02/27 07:10

現在Chromeの拡張機能を開発中です。
「あ」を「い」に変換させたくコードを書いたのですが、何かが入れ子になっていてその要素が終わったら、後のやつが置換されません。とりあえず見ていただいたほうが早いと思います。

Javascript

1var d=document.body.getElementsByTagName("*"); 2function tikan(elememts){ 3 for (let i=0;i<elememts.length;i++) { 4 elememts[i].innerHTML=elememts[i].innerHTML.replace(//g,"い"); 5 } 6} 7tikan(d);

html

1<!DOCTYPE html> 2<html> 3<head> 4 <title></title> 5</head> 6<body> 7 <p> 89 <ul> 10 <li></li> 11 </ul> 1213 </p> 14 </script> 15</body> 16</html>

したいこと↓
イメージ説明
実行結果↓
イメージ説明
Javascriptは完全に初心者なので文法的におかしいところもあると思いますがよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

babu_babu_baboo

2021/02/26 13:34

タグ要素の中には更にテキストノードが含まれています。 そこを考慮しましょう
guest

回答2

0

js

1<body> 2 <p> 34 </p><ul> 5 <li></li> 6 </ul> 78 <p></p> 9 10 11 12<script> 13 14function getNextNode (node) { 15 let n; 16 if (n = node.firstChild) return n; 17 18 do { 19 if (n = node.nextSibling) return n; 20 } while (node = node.parentNode); 21 22 return null; 23} 24 25 26let start = document.body; 27for (let n = start; n = getNextNode (n); ) 28 console.log (n.nodeName, n.nodeType, (n.data||'').trim()); 29 30</script> 31

投稿2021/02/27 12:31

編集2021/02/27 12:35
babu_babu_baboo

総合スコア616

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

html

1<body> 2 <p> 34 <ul> 5 <li></li> 6 </ul> 78 </p> 9 </script> 10</body>

<p>の中に<ul>を入れることはできないので、実際のパーズ結果は以下のようになっています:

html

1<body> 2 <p> 34 </p><ul> 5 <li></li> 6 </ul> 78 <p></p> 9</body>

document.body.getElementsByTagName("*") は body の子孫の全要素を返しますが、3つ目の「あ」は body の直下にあり子孫要素の中には入っていないので置換対象になりません。

そもそもループなしでdocument.body.innerHTML = document.body.innerHTML.replace(/あ/g, "い")だけで目的を達成できるのではないでしょうか。

あと、拡張機能特有の話になりますが、対象ページ内のノードを勝手に再構築するとページ本来の挙動が壊れる可能性がものすごく高くなります。できるだけノードの作り直しはしないで、Textノードのdataプロパティを更新したほうが安全です。

追記: document.body 以下の Text ノードの data プロパティを置換するには以下のようにします。

javascript

1const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT); 2let text; 3while ((text = walker.nextNode())) { 4 text.data = text.data.replace(//g, "い"); 5}

投稿2021/02/26 15:01

編集2021/02/27 15:36
int32_t

総合スコア21679

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tettyA

2021/02/26 23:47

すみませんが、Textノードのdataプロパティへはどういう風にすれば取得できますか?
int32_t

2021/02/27 15:36

例を追加しましたー
tettyA

2021/02/28 01:24

ありがとうございます。 無事解決できました。 また、babubabubabooさんもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問