为什么我的Chrome扩展内容脚本的运行时没有onMessage,只有connect和sendMessage。

18 浏览
0 Comments

为什么我的Chrome扩展内容脚本的运行时没有onMessage,只有connect和sendMessage。

我已经努力了几天,似乎我的扩展程序的内容脚本缺少权限或其他问题,我已经在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;
//其他的switch case...

从内容脚本:

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);
});

我的清单文件如下:

{
  "manifest_version": 2,
  "name": "扩展名",
  "short_name": "名称",
  "description": "长句子",
  "version": "1.0.0",
  "icons": { "16": "icon16.png",
             "48": "icon48.png",
             "128": "icon128.png" },
  "permissions": ["background", "tabs", "" ],
  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },
  "content_scripts":[
      {
         "matches": [""],
         "js": ["messages.js"],
      }
  ],
  "web_accessible_resources": ["injected.js"]
}

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

内容脚本:

enter image description here

后台页面:

enter image description here

0
0 Comments

问题出现的原因是在运行内容脚本时,无法使用chrome.runtime.onMessage方法。实际上,控制台中看到的是chrome.runtime的有限版本,因为访问的是网页上下文而不是内容脚本上下文。要解决这个问题,可以参考链接中的答案,从控制台访问内容脚本上下文。这解释了不同的控制台,但并没有解决消息未被接收的问题。

实际上,问题是因为背景页面中的一些本地代码异常而导致消息无法接收。感谢上述上下文解释,这正是我想知道的内容。

0
0 Comments

问题出现的原因是injectCode函数是异步的。浏览器不等待它完成,而是继续执行后台脚本,发送消息给尚未存在的内容脚本。然后injectCode函数完成,但为时已晚。

解决方法是使用回调选项,确保在执行完脚本后再发送消息。需要重新编写injectCode函数以跟踪nodeMessage。

以下是修复后的代码示例:

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

通过使用回调函数,可以确保在执行完脚本后再发送消息,从而解决了问题。

0