Chrome扩展程序 - “端口错误:无法建立连接。接收端不存在”

时间:2012-10-24 14:49:40

标签: javascript google-chrome google-chrome-extension messaging

尝试在我的background.js和contentscript.js之间进行通信

的manifest.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?

1 个答案:

答案 0 :(得分:1)

最突出的一点是:

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

目前已弃用(请参阅herehere),新方式如下所示(请注意,还包含windowId: chrome.windows.WINDOW_ID_CURRENT以说明您有多个Chrome的情况实例打开(我有很多,显然:))。

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

但是,对于您的主要问题,此{(和getSelected)会抛出您从Port加载扩展时遇到的chrome://extensions错误,New tab屏幕,或任何其他“非标准”页面(书签,查看源,检查元素本身等),所以我会忽略它们。使用您的代码,重新加载扩展程序,打开Inspect Element窗口,然后转到浏览器中的另一个选项卡并重新加载页面 - 您应该看到所需的操作已完成(我添加了console.log(pdt);调用作为{sendMessage的一部分1}}调用,并返回请求的值。换句话说,一切似乎都正常工作:)