98

我知道这个问题已经以不同的方式被反复问过,但我尝试过所有的答案(希望我没有错过任何人),但没有一个对我有用。

这是我的扩展程序代码:

显现:

{
"name": "test",
"version": "1.1",
"background": 
{ 
    "scripts": ["contextMenus.js"]
},

"permissions": ["tabs", "<all_urls>", "contextMenus"],

"content_scripts" : [
    {
        "matches" : [ "http://*/*" ],
        "js": ["jquery-1.8.3.js", "jquery-ui.js"],
        "css": [ "jquery-ui.css" ],
        "js": ["openDialog.js"]
    }
],

"manifest_version": 2
}

上下文菜单.js

function onClickHandler(info, tab) {
    if (info.menuItemId == "line1"){

      alert("You have selected: " + info.selectionText);

      chrome.extension.sendMessage({action:'open_dialog_box'}, function(){});

      alert("Req sent?");

    }
}

chrome.contextMenus.onClicked.addListener(onClickHandler);

chrome.runtime.onInstalled.addListener(function() {

  chrome.contextMenus.create({"id": "line1", "type": "normal", "title": "I'm line 1",     "contexts":["selection"]});

});

openDialog.js

chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {

  if (msg.action == 'open_dialog_box') {
    alert("Message recieved!");
  }
});

背景页面的两个警报有效,而 content_script 之一无效。

控制台日志消息:端口错误:无法建立连接。接收端不存在。

我的错在哪里?

4

5 回答 5

171

在您的背景页面中,您应该调用

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {});  
});

而不是chrome.extension.sendMessage像现在这样使用。

变体向内容脚本发送消息,chrome.tabschrome.extension函数向所有其他扩展组件发送消息。

于 2013-01-09T20:04:23.907 回答
19

@apsillers 是正确的。也不要忘记在你的内容脚本监听器中返回 true,否则它可能会过早关闭。

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log(message)
    return true
});
于 2020-08-04T16:52:23.537 回答
3

这是一个向内容脚本文件发送消息的后台脚本示例。

背景.js

chrome.tabs.sendMessage(tabs[0].id,"your message"); 

内容脚本/content.js

chrome.runtime.onMessage.addListener(function (response, sendResponse) {
          console.log(response);
});
于 2020-11-19T10:45:08.380 回答
2

提供的解决方案的问题是它们会引发其他错误(这会破坏我的谷歌浏览器)

@apsillers 解决方案有效,但回调引发错误!

它应该是什么样子

// 背景.js

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"});  
});

现在在由@Ronan Ca 提供的内容脚本中,它基于@apsillers 解决方案。由于我们从后台脚本中删除了回调,因此返回并不理想。

// ContentScripts.js

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
console.log(message)
// return true <- this and the callback in background.js are what caused a crash in extensions page of my Google chrome
});

如果我尝试使用回调来完成,后台控制台将不会打开。(撞车就这么糟糕)

于 2021-09-10T07:30:25.277 回答
1

我的用例需要从网页向后台脚本发送消息。我曾经chrome.runtime.onMessageExternal捕捉到这个消息。

在这个监听器内部,我基本上将消息转发到我的内容脚本,以便它可以做它的事情,但我无法弄清楚为什么我的内容脚本 onMessage 监听器不会捕捉到消息。

结果是在从网页发送消息之前等待 1 秒(我基本上是在加载时进行的),我能够看到消息击中了我的内容脚本。

于 2020-11-22T22:30:15.667 回答