4

ブラウザー アクションがクリックされたときにのみ、拡張機能のコードをページに挿入するために、プログラムによる挿入を使用しています。

これは、拡張機能のイベント ページにあるものです (ドキュメントの例に従って):

chrome.browserAction.onClicked.addListener(function callback(tab){
  chrome.tabs.executeScript(null, {file: "content-script.js"});
});

ただし、この仕組みでは、ボタンがクリックされるたびにスクリプトが挿入されます。

後続のボタンを押したときにスクリプトが挿入されないように変更するにはどうすればよいですか?そのページでボタンが最初にクリックされたときにのみスクリプトが挿入されるようにするにはどうすればよいですか?

4

2 に答える 2

6

contentscript に gloabl 変数を追加して、contentscript が実行されたかどうかを判断します。

if (something) { return; }
于 2013-08-28T01:17:33.070 に答える
2

私が今思いつく (簡単でシンプルな) 方法の 1 つは、html5webstorageを使用することです。バックグラウンドまたはポップアップ ページからこのコードを実行しているので、問題ありません。

if(!localStorage.getItem("isAlreadyInjected")){
   localStorage['isAlreadyInjected'] = "true";
   chrome.browserAction.onClicked.addListener(function callback(tab){chrome.tabs.executeScript(null, {file: "content-script.js"});});}

したがって、ストレージ値「isAlreadyInjected」が存在しない最初の時点で、リスナーが追加されます。その後、ブラウザーを閉じて再度開いても、この値は保存されたままになるため、リスナーは拡張機能に追加されません。

アップデート

バックグラウンド ページは最初に 1 回だけ読み込まれるため、ブラウザ アクションのクリックで再初期化されない変数を保持できます。したがって、その変数を使用して仕事をすることができます。

background.js

var isAlreadyInjected =false;
function isInjected(){

if(!isAlreadyInjected ){
    isAlreadyInjected=true;
    return false;
 }
 else
    return true;
}

popup.js

var bgpage=chrome.extension.getBackgroundPage();
 if(!bgpage.isInjected()){
    chrome.browserAction.onClicked.addListener(function callback(tab) {chrome.tabs.executeScript(null, {file: "content-script.js"});});
}

また

var bgpage=chrome.extension.getBackgroundPage();
  chrome.browserAction.onClicked.addListener(function callback(tab) { 
 if(!bgpage.isInjected()){
    chrome.tabs.executeScript(null, {file: "content-script.js"});
}});
于 2013-08-28T01:08:54.207 に答える