chrome 插件发送消息 遇到问题 ?

2013-03-28 17:43:44 +08:00
 janrone
chrome.tabs.sendMessage(tabsId[selectedId],
{
"msg": "传给前台的消息"
},
function(response) {
//回传函数
});

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.log(" 收到消息 "+ request.msg);
});

错误:Port error: Could not establish connection. Receiving end does not exist.
13648 次点击
所在节点    程序员
24 条回复
aisensiy
2013-03-28 17:52:24 +08:00
receiving end does not exist.
是你接受消息的 tab 被关掉了
janrone
2013-03-28 18:17:38 +08:00
我的tab都开这着呢。 。。
aisensiy
2013-03-28 18:22:35 +08:00
@janrone chrome.runtime 是个什么东西啊 tabs 是 chrome.tabs background 是 chrome.extension 莫非是 api 又变了?我不知道有这个唉
jeeson
2013-03-28 19:05:42 +08:00
Chrome Dev 27.x 版本吗?似乎和 Function.binding 有关
janrone
2013-03-28 21:48:14 +08:00
@jeeson 不是 dev27.x
janrone
2013-03-28 21:49:20 +08:00
@aisensiy 我刚接触几天 貌似之前的是request 现在是 sendMessage
shinemoon
2013-03-29 10:28:54 +08:00
大致看了下,因为我自己一直习惯都用Port来传递消息,没有直接用你的代码,但是从API定义来看:

tabs.sendMessage是向你指定的tab内的content script发送消息,所以只有addlistener放在你的content script才有用吧;runtime是指代background,它是用来接收来自tab的content script或者扩展其他页面的消息的....

纯纸上分析,仅做参考..
janrone
2013-03-29 10:44:21 +08:00
@shinemoon 我現在的問題是 background.JS 給 contentscript 發消息,只要能發過去接受到,用什麼方法都可以 。 剛接觸chrome ,請指教,謝謝 。
aisensiy
2013-03-29 11:51:04 +08:00
https://developer.chrome.com/extensions/messaging.html

这个文档说的还是很清楚的吧,有 content to background 也有 background to content
janrone
2013-03-29 14:19:36 +08:00
@aisensiy background.js 和 background.html 應該都一樣吧
aisensiy
2013-03-29 14:22:09 +08:00
@janrone 嗯 一样的 一个是默认给你生成 background.html 一个是你主动建立 background.html
janrone
2013-03-29 14:34:24 +08:00
@aisensiy 還是同樣的錯誤呢 。
shinemoon
2013-03-29 18:26:28 +08:00
@janrone

1. 确认你的content script 成功注入了tab?有没有试着打印或者alert确认下?

2. 顺手试了下,反正在我添加所谓的onMessage listener之前,tabs.sendMessage的尝试都会得到你遇到的同样的错误(确认tabid无误),但是当我试着按照一样的方法runtime.onMessage时,却发现chrome.runtime下居然没有onMessage? (Chrome v24)

如果是我,我还是更喜欢一直以来用的方式,那就是用port.sendMessage 和port.onMessage.. 百试不爽...
janrone
2013-03-29 18:36:59 +08:00
@shinemoon 是注入tab 了,alert 有提示 。 我完了你的 1,和2 意思是也和我的錯誤一樣的唄? 還是?。

port 不會用,給發個demo唄,謝謝 。
shinemoon
2013-03-29 23:08:24 +08:00
shinemoon
2013-03-29 23:18:13 +08:00
@janrone

第二点是说不晓得什么原因我这边看起来runtime.onMessage居然是undefined,奇怪...不管了

port很简单,几个要点:

1. 你要在你注入的content script当中,声明并且连接你的port,同时添加onMessage事件

例如:
var port = chrome.extension.connect({name:'raw_page'});
port.onMessage.addListener(function(msg) {
......


2. 在你的background中,等待连接,并且,捕捉这个接口,同时设定listener动作

例如:

chrome.extension.onConnect.addListener(function(port) {
switch(port.name){
case ('raw_page'):
rawPagePort = port;
rawPagePort.onMessage.addListener(function(msg) {

.....
你可以不用这么复杂,之所以用name之类的是,当你扩展需要有很多个不同页面向后台发起多个port连接时,有了name,你可以清除的分清和控制不同的port,从而可以清楚的向该port定向发送;

3. 需要互通信息的时候,很简单,在background里直接postMessage好了:
rawPagePort.postMessage({message:'show message',value:value});

4. 反之依然,当你需要从content script向background发送消息,也只需要对着这个port做postMessage就OK了。
janrone
2013-03-30 10:31:04 +08:00
@shinemoon 这种是属于 Long-lived connections 吧 ?
janrone
2013-03-30 11:14:34 +08:00
@shinemoon 我发你邮箱,您帮我看看。。。?
ehaagwlke
2013-03-30 14:07:21 +08:00
你用这个是想实现什么呢?
如果是用content script获取tab中页面上的信息,然后发给background(一次性的连接), 可以在content script中用chrome.extension.sendMessage()发送tab里的东西, 然后在background里用chrome.extension.onMessage.addListener()来收。
janrone
2013-03-30 17:52:19 +08:00
@ehaagwlke 实现hsitory.back();

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/64337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX