1

私のbackground.jsとcontentscript.jsの間で通信しようとしています

マニフェスト.json

{
    "name": "xxx",
    "version": "0.1",
    "manifest_version": 2,

    "permissions": [
        "tabs"
    ],

    "description": "xxx",
    "icons": { "16": "icon16.png",
               "48": "icon48.png",
               "128": "icon128.png" },

    "browser_action": {
        "default_title" : "xxx",
        "default_icon": "icon16.png",
        "default_popup": "popup.html"
    },

    "background": {
        "scripts": ["background.js"]
    },

    "content_scripts" : [
    {
        "matches" : [ "http://*/*" ],
        "js" : [ "contentscript.js", "jquery.js" ]
    }
  ]
}

background.js

var listePdt = {};
var selectedPdt = null;
var selectedId = null;

function updatePdt(tabId)
{
    chrome.tabs.sendMessage(tabId, {}, function(pdt) {
            chrome.pageAction.show(tabId);
    });
}

chrome.tabs.onUpdated.addListener(function(tabId, change, tab) {
    if(change.status == "complete")
    updatePdt(tabId);
});

chrome.tabs.onSelectionChanged.addListener(function(tabId, info) {
    selectedId = tabId;
    // and other things
});

chrome.tabs.getSelected(null, function(tab) {
    updatePdt(tab.id);
});

contentscript.js

if(window == top)
{
    chrome.extension.onMessage.addListener(
        function(req, sender, sendResponse) {
            sendResponse(findPdt());
        }
    );
}

var findPdt = function() {

    // operations on a string

    return "string";
}

しかし、生成されたバックグラウンドページのコンソールに次のエラー「ポートエラー:接続を確立できませんでした。受信側が存在しません」が表示されます...理由がわかりません。

ヘルプplzはありますか?

4

1 に答える 1

1

際立っていることの1つは次のとおりです。

chrome.tabs.getSelected(null, function(tab) {
    updatePdt(tab.id);
});

現在非推奨であり(ここここを参照)、新しい方法は次のようにwindowId: chrome.windows.WINDOW_ID_CURRENTなります(複数のChromeインスタンスを開いている場合を考慮して含まれていることに注意してください(私はそれらをいくつか持っていたようです:))。

chrome.tabs.query(
  {windowId: chrome.windows.WINDOW_ID_CURRENT, active: true}, function(tab) {
  updatePdt(tab.id);
  } );

ただし、主な問題に関しては、これ(および)は両方とも、、画面、またはその他の「非標準」ページ(ブックマーク、ソースの表示、要素自体の検査など)から拡張機能をロードしたときに表示されるエラーをgetSelectedスローします。 )、だから私はそれらを無視します。コードを使用して、拡張機能をリロードし、[要素の検査]ウィンドウを開いてから、ブラウザーの別のタブに移動してページをリロードします-目的のアクションが完了したことを確認します(呼び出しの一部として呼び出しを追加しましたが、要求された値は言い換えれば、すべてが正常に機能しているように見えました:)Portchrome://extensionsNew tabconsole.log(pdt);sendMessage

于 2012-10-27T06:31:49.530 に答える