javascript - Chrome 扩展程序 - "Port error: Could not establish connection. Receiving end does not exist"

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

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

ma​​nifest.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" ]
    }
  ]
}

背景.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";
}

但是我在生成的后台页面的控制台中收到以下错误“端口错误:无法建立连接。接收端不存在”...不明白为什么。

有什么帮助吗?

最佳答案

值得注意的一件事是:

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

关于javascript - Chrome 扩展程序 - "Port error: Could not establish connection. Receiving end does not exist",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13051707/

相关文章:

javascript - 浏览器刷新 - 丢失服务堆栈身份验证 session 数据

javascript - 按类对元素进行编号并获取特定 div 的位置

python 3.6 selenium webdriver 错误 X display is required for sending-keys unable to ues Xvfb

html - css: column-count property - 如何用css修改它来修改每列中的元素数?

google-chrome - 从 chrome 浏览器启动我安装的应用程序

google-chrome-extension - 在从 Google Chrome 网上商店安装我的 google-chrome-extension 之前,如何让用户同意我的 EULA?

javascript - Firefox Extension util/match-pattern 子目录

Javascript Base64 解码失败

css - 表格和表格单元格在 Chrome 和 Firefox 中的工作方式不同

javascript - OpenLayers3 WMTS 内存不足错误