人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

chrome extension について。

ページ内から、contentscripts.js に書いてある
関数を呼び出す方法を教えて下さい。

分かりやすいページを教えて下さっても構いません。


contentscripts.js に下記の様に書き
function hoge(id){ alert(id); }

html内のdivに onclick="hoge('a123')" を追記して
divをクリックしても動作しません。
<div onclick="hoge('a123')">xxxxx</div>

これを、同じ事が出来るように教えて頂けるか、
説明しているページを教えて欲しいのです。

宜しくお願いします。


追記です。

こちらのページを見たのですが、このようにするのが理想でしょうか。
もっと簡単にできる方法はありますでしょうか。
http://d.hatena.ne.jp/IT7C/20151221/1450698892

●質問者: worldtravel
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● ぽけっとしすてむ
●50ポイント

contentscripts.js からHTML内にタグを挿入することで動作します。

質問の状況を整理すると、

  1. onclick が記述されているHTMLページに
  2. contentscripts.js を挿入したが
  3. 上手く動作しない

と読むことができますが、この認識で良いでしょうか。

拡張機能の仕様として、見かけ上は同じページにスクリプトが挿入されていても互いに干渉することができないため、代替の手段を取る必要があります。

引数を渡したい場合、data属性を利用するなど、いくつかの方法があります。

※参考として、以前サンプルとして用意したはてなブログの一部分に挿入するものもご確認ください。
はてなブログのエディタ画面で何かを表示させるサンプル拡張機能


worldtravelさんのコメント
ありがとうございます。 教えて頂いたことと、求めていたことが少々違うようでした。 教えて下さった内容で説明しますと、 injection.js 内に function hoge(id){ alert(id); } と書いておき、 追加した <div>こんにちは!こんにちは!</div> に、 onclick属性を追加して <div onclick="hoge('a123')">こんにちは!こんにちは!</div> とし、 これをクリックした際に、injection.js 内に書いた関数でアラートを表示したいと言うことです。 この書き方では動かないのは承知しているので、 どうすれば、同じ事が出来るかを知りたいのです。 実際にはアラートを表示したいわけではないのですが、 関数の呼出方や、引数の渡し方を知りたいと考えております。 宜しくお願い致します。

2 ● a-kuma3
●300ポイント ベストアンサー

公式ページでは、window.postMessage() を使う例が挙げられています。

ただ、window.postMessage() の説明では、以下のようなことも書かれています。
Window.postMessage() - Web APIs | MDN #Using window.postMessage in extensions

Content scripts should use runtime.sendMessage to communicate with the background script. Web context scripts can use custom events to communicate with content scripts (with randomly generated event names, if needed, to prevent snooping from the guest page).

質問の追記に書かれているはてなダイアリーで紹介されている方法です。

ただ、括弧内に書かれているようにイベントの名前を送る側(Web content script) と受ける側(Content script)で握っておかなければいけないので、先の MDN のサンプルコードのように、送信するデータに決まった目印を入れて、それを受け取る側でチェックをすれば、window.postMessage() とあまり変わらないような気もします。

// page-script.js

var messenger = document.getElementById("from-page-script");

messenger.addEventListener("click", messageContentScript);

function messageContentScript() {
 window.postMessage({
 direction: "from-page-script",
 message: "Message from the page"
 }, "*");
// content-script.js

window.addEventListener("message", function(event) {
 if (event.source == window &&
 event.data &&
 event.data.direction == "from-page-script") {
 alert("Content script received message: \"" + event.data.message + "\"");
 }
});


因みに、Developer.chrome.com のサンプルのように、送り元を特定するなら "type" のような属性名にするのが自然だろうに、何故に "direction" というのは、先の MDN のサンプルコードの末尾にある ”visit the demo page on GitHub” を見ると分かります。
そのサンプルでは、Content script → Web content script への通信も併せて書いてあるからです。


worldtravelさんのコメント
ありがとうございます。 頭が悪くて理解できない部分もあるのですが、無事思い通りに出来ました。 このくらいシンプルだと助かります!! 汎用的に使いやすくも出来ました。 この数日、色々と調べていても解決できず悩んでおりましたので、助かりました。 ありがとうございました。

a-kuma3さんのコメント
>> 汎用的に使いやすくも出来ました。 << 似たようなことやってました <tt>:-)</tt> >|javascript| // content script const called_from_web_content = { hoge: (id, message) => { alert(id + " - " + message); }, }; window.addEventListener("message", evt => { if (evt.source == window && evt.data && evt.data.type == "function.call") { if (typeof(called_from_web_content[evt.data.name]) == "function") { called_from_web_content[evt.data.name].apply(null, evt.data.param); } } }); ||< >|javascript| // page script function call_content_script_function(name, param) { const type = "function.call"; window.postMessage({type, name, param}, "*"); } function cs_hoge(id, message) { call_content_script_function("hoge", Array.from(arguments)); } cs_hoge("a-kuma3", "V! V! V! Victory!"); ||< パラメータは何でも渡せるわけじゃないっぽくて、なので <code>Array.from(arguments)</code> なんてふうになってたりします。

worldtravelさんのコメント
なるほど! 現時点では簡単な文字列しか渡していなかったので気が付きませんでした。 ありがとうございます(^^
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ