6

コンテンツ スクリプトを使用すると、スクリプト タグを DOM に挿入して、元のページの変数にアクセスできます (この質問で説明されているように)。

コードをすべてのページに挿入することを避け、代わりにユーザーが拡張機能のアイコンをクリックしたときにのみ挿入したいと考えています。

コンテンツ スクリプトと同じコードを使用しようとしたところ、スクリプトは正しく挿入されましたが、値は定義されていませんでした。

これは可能ですか?それ以外の場合は、コンテンツ スクリプトを使用して、それと通信することをお勧めしますか?

私が使用しているコードは次のとおりです。

var scr = document.createElement("script");
scr.type="text/javascript";
scr.innerHTML = "setInterval('console.log(window.testVar)', 1000)"
document.body.appendChild(scr)

マニフェストの抜粋:

 "permissions": [
    "tabs",
    "http://*/*", "https://*/*"
  ],
  "background": {
    "scripts": ["inject.js"]
  },
4

3 に答える 3

4

次のコードを使用して、新しいバックグラウンド スクリプトを作成できます。

chrome.browserAction.onClicked.addListener( function() {
  chrome.tabs.executeScript( { file: 'inject.js' } );
});

inject.js拡張機能の一部として残す必要がありますが、マニフェストで言及する必要はありません。このように、拡張アイコンを押すたびにコンテンツ スクリプトとして実行されます。browserAction を定義するマニフェストの部分は含めませんでしたが、default_popup.

于 2013-09-10T20:59:08.917 に答える
3

バックグラウンド スクリプトを使用して、ページのコンテキスト内で JavaScript を実行できますが、JavaScript は、ページ内から読み込まれた JavaScript から分離された環境で実行されます。

次の点を考慮してください。

page.html で:

<button id="myButton" onclick="console.log('Message from within the page');" />

バックグラウンド スクリプトで:

chrome.tabs.executeScript({
  code: '$("#myButton").click(function() { console.log("Message from background script."); });'
});

ここで、ページ内のボタンをクリックすると、コンソール ウィンドウに両方のログ メッセージが表示されます。JavaScript コンテキストは互いに分離されていますが、postMessage と共有 DOM を介したメッセージングの顕著な例外があります。

于 2014-01-10T03:04:04.647 に答える