11

Google Chrome の拡張機能開発者セクションでは、次のように述べています。

拡張機能内の HTML ページは、互いの DOM に完全にアクセスでき、互いに関数を呼び出すことができます。... ポップアップの内容は、HTML ファイル (popup.html) で定義された Web ページです。ポップアップはバックグラウンド ページの関数を呼び出すことができるため、バックグラウンド ページ (background.html) にあるコードをポップアップで複製する必要はありません。

jQuery を読み込んでテストし、jQuery を使用して background.html の DOM 要素にアクセスできますが、background.html から popup.html の DOM 要素にアクセスする方法がわかりません。

4

3 に答える 3

7

なぜそれをしたいのか話し合ってもらえますか?バックグラウンド ページは、拡張機能の有効期間中ずっと存続するページです。ポップアップページは、ポップアップをクリックしたときにのみ有効です。

私の意見では、逆にリファクタリングする必要があり、ポップアップはバックグラウンド ページから何かを要求する必要があります。背景ページにアクセスするには、ポップアップでこれを行うだけです: chrome.extension.getBackgroundPage()

ただし、どうしてもという場合は、 sendRequest()onRequestを使用して、拡張ページとの簡単な通信を使用できます。おそらくchrome.extension.getViewsを使用できます

于 2010-05-05T03:43:23.297 に答える
4

私自身が問題に遭遇したので、なぜこれをやりたいのか理解しています。

私が考えることができる最も簡単なことは、Google のコールバック メソッドを使用することでした。

Popup.js

chrome.extension.getBackgroundPage().doMethod(function(params)
{
    // Work with modified params
    // Use local variables
});

Background.html

function doMethod(callback)
{
    if(callback)
    {
        // Create/modify params if needed
        var params;

        // Invoke the callback
        callback(params);
    }
}
于 2011-01-04T01:01:32.830 に答える
4

他の回答が言及しているように、次のように popup.js から background.js 関数を呼び出すことができます。

var _background = chrome.extension.getBackgroundPage();
_background.backgroundJsFunction();

しかし、background.js から popup.js または popup.html にアクセスするには、次のようなメッセージ アーキテクチャを使用する必要があります。

// in background.js
chrome.runtime.sendMessage( { property: value } );

// in popup.js
chrome.runtime.onMessage.addListener(handleBackgroundMessages);
function handleBackgroundMessages(message)
{
    if (message.property === value)
        // do stuff
}

ただし、逆に同期アクセスできるように、background.js から popup.js に同期アクセスできるようです。chrome.extension.getViewspopupwindowオブジェクトを取得でき、それを使用して関数を呼び出し、変数にアクセスし、DOM にアクセスできます。

var _popup = chrome.extension.getViews( { type: 'popup' } )[0];
_popup.popupJsFunction();
_popup.document.getElementById('element');
_popup.document.title = 'poop'

ポップアップが開いていない場合はgetViews()が返されるので、それを処理する必要があることに注意してください。[]

他の誰もこれについて言及しなかった理由はわかりません。おそらく、私が見落としているいくつかの落とし穴や悪い習慣があるのでしょうか? しかし、私自身の拡張機能での限定的なテストでは、うまくいくようです。

于 2017-06-13T06:44:31.157 に答える