2016-10-07 2 views
0

バックグラウンドスクリプトの変数をページ(ポップアップ)スクリプトから制御する方法は?
リソースを10秒ごとに取得するには、以下のコードでsetTimeoutループを使用しています。
ポップアップページ(browser_action)のチェ​​ックボックスをオフにした場合、以下のコードはループを停止しません。バックグラウンドスクリプトとページ(ポップアップ)スクリプト間の通信方法は?

私は(check or uncheck)チェックボックスをポップアップで、background_scriptがバックグラウンドスクリプトにメッセージを送ったときに、stop_loopメッセージを受け取ると、バックグラウンドスクリプトは、settimeoutループを止めるためにsettimeout_loop_controllerをfalseに変更します。

ただし、チェックボックスをクリックするとこのコードは反応しません。

2つのスクリプト間の通信方法は?

let settimeout_loop_controller = true; 

function fetching() { 
    if (settimeout_loop_controller) { 
    // if 'settimeout_loop_controller become false, the loop will stop. 
     fetch("http://url.com/example").then((getval) => { do_something })... ; 
     setTimeout(fetching, 10000); 
    } else { 
     return; 
    } 
} 

fetching(); 

chrome.runtime.onMessage.addListener((message) => { 
    if message.type === "stop_loop" { 
     settimeout_loop_controller = false; 
    } 
    else if (message.type === "start_loop") { 
     settimeout_loop_controller = true; 
     fetching(); 
    } 
}); 

ポップアップスクリプトは:

let checkbox = document.getElementById("checkbox"); 

checkbox.onchange((e) => { 
    if (checkbox.checked) { 
     chrome.runtime.sendMessage({"type": "start_loop"}); 
    } 
    else { 
     chrome.runtime.sendMessage({"type": "stop_loop"}); 
    } 
}); 
+0

トピックになるように[編集]してください:**完全** [mcve]問題を複製してください。通常、* manifest.json *、バックグラウンド、コンテンツ、ポップアップスクリプト、HTMLの一部が含まれます。デバッグの助けを求める質問(「**なぜこのコードは動作しないのですか?**」)には、以下が含まれていなければなりません:►必要な動作、►特定の問題またはエラー*、および►問題を再現するのに必要な最短コード自体**。明確な問題文がない質問は、他の読者にとって有用ではありません。参照してください: "**どのように[mcve] **を作成するか"、[ここで私はどんな話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)、[ask] – Makyen

+0

[Firefox WebExtension設定ページ](http://stackoverflow.com/a/39236352/3773011)はFirefoxとChromeで完全に機能しテストされています。たとえば、オプション/ポップアップページと背景のスクリプト。 – Makyen

+0

[mcve]が必要なのは、私たちが手伝ってくれることです。問題を再現するために必要なすべてのコードを再作成する必要がなければ、**多くの**助けが簡単です。これはあなたがすでに持っているコードです。だから、私たちを助けて、そのような質問の問題を再現する完全な* [mcve]を提供してください。 [mcve]がなければ、あなたを助け始めるために必要な努力の量は、あなたを喜んで助けることができる人の数を大幅に減らします。私たちが余計な努力をしても、あなたの問題の重要な部分を*推測する必要があります。 – Makyen

答えて

2

chrome.runtime.sendMessage APIは、ページスクリプトには存在しませんが、それはコンテンツスクリプトにアクセスすることができます。典型的な使用法はページスクリプトコンテンツスクリプトwindow.postMessage({"type": "stop_loop"},"*")を使用してメッセージを投稿してからコンテンツスクリプトにメッセージを転送します。
Firefox 49以降では、Sharing objects with page scriptsとすることができます。たとえば、最初にとexportFunction(notify, window, {defineAs:'notify'});の関数をのコンテンツスクリプトに定義することができます。ページスクリプトはwindowオブジェクトの公開された関数を呼び出すことができます。

window.notify( "ページスクリプトからのメッセージ!");

関連する問題