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

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

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

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

Chrome extension

Chrome拡張機能

Q&A

解決済

1回答

132閲覧

chrome拡張のcontent_scriptsで、閲覧中のWebページにajaxCompleteのイベントリスナーをDOM注入したが、これの発火をcontent_script側で検知したい。

k.hojo

総合スコア2

JavaScript

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

Chrome extension

Chrome拡張機能

0グッド

1クリップ

投稿2024/12/18 00:54

実現したいこと

chrome拡張のcontent_scriptsで、閲覧中のWebページにajaxCompleteのイベントリスナーをDOM注入したが、このイベントリスナーが実行されたことをcontent_script側で検知したい。

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

以下のソースコードで、ajaxCompleteのイベントリスナーが実行されたときに、

console.log('call ajaxComplete');

のログは出力されるが、

console.log( 'callback : ' + $(this).val() );

のログは出力されない。
一方で、対象のWebページの、$('#control_flg')のテキストボックスに対して、直接、手で値を入力すると、

console.log( 'callback : ' + $(this).val() );

のログが出力される。
そもそも何をしたかったかというと、
ajaxCompleteでサーバから取得した値を、content_scriptsに渡して、
さらに、background.jsに渡して値を保存することで、
対象のWebページが画面遷移した後でもその値を取得して使えるようすることです。
これが実現できれば、まったく別のアプローチでも問題ありません。

該当のソースコード

JavaScript、content_scripts

1const injectScript = (filePath, tag) => { 2 var node = document.getElementsByTagName(tag)[0]; 3 var script = document.createElement('script'); 4 script.setAttribute('type', 'text/javascript'); 5 script.setAttribute('src', filePath); 6 node.appendChild(script); 7 var controllFlg = document.createElement('input'); 8 controllFlg.setAttribute('id', 'control_flg'); 9 controllFlg.setAttribute('type', 'text'); 10 controllFlg.setAttribute('value', '0'); 11 node.appendChild(controllFlg); 12 $('#control_flg').change(function() { 13 console.log( 'callback : ' + $(this).val() ); 14 }); 15} 16injectScript(chrome.runtime.getURL('web_accessible_resources.js'), 'body'); 17

JavaScript、web_accessible_resources.js

1$(document).ajaxComplete(async function() { 2 console.log('call ajaxComplete'); 3 $('#control_flg').change(); 4});

試したこと・調べたこと

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

content scriptと、閲覧中のWebページのJavaScript環境が別のものであることが原因だと思われますが、この両者でイベントを連動させる方法が調べても分かりませんでした。

補足

特になし

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

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

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

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

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

guest

回答1

0

ベストアンサー

change()でも動きそうな気がしますけど、何かjQuery特有の事情で動かないのかもしれません。

  • 送信側で window.postMessage("foo", "*") を実行し、受信側で window.addEventListener("message", e => { ... }) で待ち受ける

  • 送信側で特定要素の属性や子ノードを書き換えて、受信側でMutationObserverで待ち受ける

などの方法が取れるかと思います。

chrome.webRequest というAPIがありますが、どうやらレスポンスのコンテンツは取得できないみたいですね。

投稿2024/12/18 04:33

int32_t

総合スコア21775

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

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

k.hojo

2024/12/18 06:45

ご回答ありがとうございます。 「MutationObserver」を、試したところ問題が解決しました! 「window.postMessage」という方法もあるんですね。勉強になります。 ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問