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

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

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

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

JavaScript

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

Q&A

解決済

1回答

2933閲覧

GoogleChromeの拡張機能内のcontent_scriptsでのスコープついて

hirokiono1015

総合スコア14

Chrome

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

JavaScript

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

0グッド

0クリップ

投稿2018/10/17 04:50

GoogleChromeの拡張機能の開発をしています。

URL右の拡張機能ボタンをクリックしたら動作するように作成していて、
ボタンをクリックしたら
backgroundの"background.js"から
content_scriptsの"contents.js"へアクション動作を渡すところまでできました。

今回したい内容として"contents.js"の中の動作で
現在表示しているページのJSで作成されたAPIや変数をスコープしたいです。

"contents.js"の中でページ側の変数を参照しようとしてもundifinedと出て参照できませんでした。
参照方法を知っている方いますでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ページの(JSの)コンテキストと拡張機能側(content.js)のコンテキストは別ですので、ページ内JSで定義されたものには直接アクセスすることはできません。

やるとすれば、一応、ページとcontent_sc間でデータのやり取りを行う方法はいくつかありますが(window.postMessageやchrome.runtime.sendMessage等)、私がよく使う方法は、DOMのイベントはページはもちろんですがcontent.js上でもハンドルすることができるので、CustomEventを使い独自のイベントを発行することでページとcontent.js間で連携させるというものです。
ちょっと、冗長的なコードとなりますが、これにより一応、content.jsからページ上の変数や関数の実行を行うことができるようになります。

js

1const script = document.createElement('script'); 2const code = '(' + function () { 3 window.addEventListener('execPageFunc', arg => { 4 const res = pageFunc(arg.detail); 5 window.dispatchEvent(new CustomEvent('pageFuncResult', { detail: res })); 6 }); 7} + ')()'; 8script.text = code; 9// documentにexecPageFuncイベントハンドラを設定する関数を記述したスクリプト(<script>)を追加。 10// documentに追加された<script>はページのコンテキストで実行されるのでページ上のJavaScriptで定義されたものにアクセスできる。 11document.head.appendChild(script); 12 13const arg = { 14 hoge: 'fuga' 15}; 16// content.jsからexecutePageFuncイベントを発火 17window.dispatchEvent(new CustomEvent('execPageFunc', { detail: arg })); 18// pageFuncResultイベントハンドラ設定 19// このイベントによりpageFunc()実行結果を取得 20window.addEventListener('pageFuncResult', arg => { 21 const res = arg.detail; 22 console.log(res); 23});

投稿2018/10/17 07:34

turbgraphics200

総合スコア4269

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

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

hirokiono1015

2018/10/18 00:38 編集

回答ありがとうございます。 上記方法理解しました。こういった方法があるのですね!! 実際に上記方法で試したところ動作しました!! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問