javascript - 为什么我的 Chrome 扩展内容脚本的运行时没有任何 onMessage 仅连接和发送消息

标签 javascript google-chrome google-chrome-extension

我已经为此苦苦挣扎了好几天,我的扩展程序的内容脚本似乎缺少权限或其他东西,我搜索了 API 文档,但什么也没找到。

如果我使用以下代码从内容页面发送消息,而不是向内容页面发送消息,则消息传递有效:

从后台页面:

var messageCallback = function (e) {
    var nodeMessage = JSON.parse(e.data);

    switch (nodeMessage.ExecutionType) {
        case 0:
            chrome.tabs.create({ url: nodeMessage.Url }, function (tab) {

                //injects injected.js NOT messages.js
                injectCode(tab.id);

                chrome.tabs.sendMessage(tab.id,nodeMessage);
            });
        break;
//some other switch cases...

来自内容脚本:

chrome.runtime.onMessage.addListener(function (message) {
    console.log('Message received');

    var event = new CustomEvent("foo_receive", {
        detail: message,
        bubbles: true
    });

    console.log('Event sent');
    document.dispatchEvent(event);
});

我的 list 如下所示:

{
  "manifest_version": 2,

  "name": "extesnion_name",
  "short_name": "thing",
  "description": "long sentence",
  "version": "1.0.0",
  "icons": { "16": "icon16.png",
             "48": "icon48.png",
             "128": "icon128.png" },
  "permissions": ["background", "tabs", "<all_urls>" ],
  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },
  "content_scripts":[
      {
         "matches": ["<all_urls>"],
         "js": ["messages.js"],
      }
  ],
  "web_accessible_resources": ["injected.js"]
}

在 Chrome 控制台中显示以下内容:

内容脚本:

enter image description here

和背景页:

enter image description here

最佳答案

你还没有向我们展示,但我猜你的后台脚本已经展示了

function injectCode(tabId) {
    chrome.tabs.executeScript(tabId,{"file":"contentScript.js"});
}

问题是这个函数是异步的。浏览器不会等待它完成,而是继续执行后台脚本,该脚本将消息发送到不存在的内容脚本。然后 injectCode 完成,但为时已晚。

Here是一个很好的引用。简而言之,您需要使用callback选项,这样您最终会得到

chrome.tabs.executeScript(tabId,{"file":"contentScript.js"},function() {
    chrome.tabs.sendMessage(tabId,nodeMessage);
});

但现在您需要重做 injectCode 函数来跟踪 nodeMessage

关于javascript - 为什么我的 Chrome 扩展内容脚本的运行时没有任何 onMessage 仅连接和发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29945179/

相关文章:

javascript - JQuery获取元素.height()然后减去100vh?

javascript - 为什么 Mag Pagination 和 Mag Sort 不起作用

javascript - Chrome 中奇怪的 javascript 内存

javascript - 我们如何使用 javascript 或 jquery 获取由 chrome 计算的元素的高度和宽度?

sockets - 如何将 chrome web 扩展与本地主机服务器连接?

javascript - 以编程方式单击 chrome 扩展程序中 Gmail 的 "show original"按钮?

javascript - 像Windows 8 Metro IE一样创建键盘 "Extension"

javascript - 如何为传播运算符创建 polyfill

javascript - 如何使用 JavaScript 将音频从 MediaStreamAudioSourceNode 保存到 AudioBuffer?

javascript - 如何将选项卡缩略图保存到本地存储?