質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.37%
Chrome

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Chrome extension

Chrome拡張機能

Q&A

解決済

2回答

374閲覧

自作のChrome拡張機能が動きません

kannnna

総合スコア7

Chrome

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

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Chrome extension

Chrome拡張機能

0グッド

2クリップ

投稿2024/09/02 22:53

実現したいこと

メルカリで、ショップスかどうか判別する拡張機能を作りたいです

発生している問題・分からないこと

HTMLの書き換えすらしたことがなく、原因も分からず、初心者の私には手詰まりになってしまいました。

該当のソースコード

manifest.json

1{ 2 "name": "ショップス", 3 "version": "3.0.0", 4 "manifest_version": 3, 5 "description": "ショップスに表示します", 6 "content_scripts": [ 7 { 8 "matches": [ 9 "https://jp.mercari.com/*" 10 ], 11 "js": [ 12 "script.js" 13 ], 14 "run_at": "document_end", 15 "all_frames": true 16 } 17 ] 18} 19

script.js

1window.addEventListener("load", main, false); 2let after = document.createElement("p"); // <p></p> タグ作成 3 4function main(e) { 5 const jsInitCheckTimer = setInterval(jsLoaded, 1000); 6 function jsLoaded() { 7 if (document.querySelectorAll('html body') != null) { 8 clearInterval(jsInitCheckTimer); 9 let target = document.querySelectorAll("div[itemtype='ITEM_TYPE_BEYOND']"); // 追加したい要素を見つけてくる 10 for (let i = 0; i < target.length; i++) { // 追加したい要素ごとに繰り返し 11 after.textContent = "これはメルカリShops"; // <p>Push Me!</p> タグに文字を追加 12 target.appendChild(after); // 子タグとして追加 13 }; 14 }; 15 }; 16}; 17

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

https://zenn.dev/ukkz/articles/69cda7047f23c9
非常に重くなり、エラーも出ず、タグの追加もされませんでした。
Twitterでは動きました。

https://qiita.com/3mc/items/c3c580ca5de4a2d3990d
エラーもでず、タグの追加もされませんでした。

補足

何卒、よろしくお願いいたします。

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

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

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

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

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

int32_t

2024/09/02 23:18

このコードで、具体的にどういう結果になるはずが、具体的にどういう結果になってしまうのでしょうか。
kannnna

2024/09/03 00:46 編集

ありがとうございます! 説明不足で申し訳ありません。 商品の一覧ページで、商品名の下に「これはメルカリShops」と表示させたいですが、表示されません。 よろしくお願いします。
int32_t

2024/09/03 00:53

変数targetに値を入れるところまでコードが実行されているかどうか確認しましたか? DevToolsのコンソールに何かエラーが出ていませんか?
Lhankor_Mhy

2024/09/03 05:00 編集

Chrome拡張は全く分からないので回答欄ではなくここに書きます。 まず、ご提示のコードですと、loadイベントが起きたときに html body がないということは考えにくいので、これは動作しないのではありませんか? 動的なコンテンツの待ち合わせをするなら、もっと動的なコンテンツの中からDOM要素を選ぶべきでは? また、for ループのなかで target.appendChild(after) を繰り返し実行すると、after はクローンされていないのでどんどん移動して、結果的には最後の商品名だけに「これはメルカリShops」が表示されることになりませんか?
kannnna

2024/09/03 13:12

皆様ありがとうございます! pythonしか触ったことがないため、試すのに時間がかかってしまいました。 無事、解決いたしました。ありがとうございました!
guest

回答2

0

ベストアンサー

メルカリでは動的にDOMを生成していますので、bodyがnullでないからといって、対象の要素div[itemtype='ITEM_TYPE_BEYOND']が既に出現してるとは限りません。

次のように修正します:

javascript

1main() 2async function main(){ 3 let targets = await waitTargetElements() //対象の要素が出現するまで待機し、出現したらそれを代入する 4 targets.forEach(target => { 5 //insertAdjacentHTMLを使用すればより簡潔に書ける 6 target.insertAdjacentHTML("beforeend", "<p>これはメルカリShops</p>") 7 }) 8} 9 10function waitTargetElements(){ 11 return new Promise(resolve => { 12 let waitElement = setInterval(() => { 13 let targets = document.querySelectorAll("div[itemtype='ITEM_TYPE_BEYOND']") 14 //監視対象の要素はbodyではなく、対象の要素自身にする 15 //対象の要素数が0ではないとき、このif文はtrueになる 16 if(targets.length){ 17 resolve(targets) 18 clearInterval(waitElement) 19 } 20 },1000) 21 }) 22}

実行結果
イメージ説明

投稿2024/09/03 12:33

編集2024/09/03 12:36
FoxRefire

総合スコア146

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

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

kannnna

2024/09/03 13:12

回答ありがとうございます。 試したところ問題が解決しました! 本当にありがとうございました!
guest

0

変数targetの初期化まで実行できていると仮定すると、その次の target.appendChild(...) でエラーが発生するはずです。target は要素ではなく要素のリストだからです。

また、createElement() の結果の使いまわしはできないので、ループ内で毎回 createElement() する必要があります。

js

1for (let e of target) { 2 const after = document.createElement('p'); 3 e.appendChild(after).textContent = "これはメルカリShops"; 4}

注: 対象サイトの作りによっては target の初期化まで辿り着かない可能性もあります。

投稿2024/09/03 03:11

編集2024/09/03 03:13
int32_t

総合スコア21601

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

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

kannnna

2024/09/03 13:13

回答ありがとうございます! 無事、解決いたしました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問