1
aisensiy 2013-03-28 17:52:24 +08:00
receiving end does not exist.
是你接受消息的 tab 被关掉了 |
2
janrone OP 我的tab都开这着呢。 。。
|
3
aisensiy 2013-03-28 18:22:35 +08:00
@janrone chrome.runtime 是个什么东西啊 tabs 是 chrome.tabs background 是 chrome.extension 莫非是 api 又变了?我不知道有这个唉
|
4
jeeson 2013-03-28 19:05:42 +08:00
Chrome Dev 27.x 版本吗?似乎和 Function.binding 有关
|
7
shinemoon 2013-03-29 10:28:54 +08:00
大致看了下,因为我自己一直习惯都用Port来传递消息,没有直接用你的代码,但是从API定义来看:
tabs.sendMessage是向你指定的tab内的content script发送消息,所以只有addlistener放在你的content script才有用吧;runtime是指代background,它是用来接收来自tab的content script或者扩展其他页面的消息的.... 纯纸上分析,仅做参考.. |
8
janrone OP @shinemoon 我現在的問題是 background.JS 給 contentscript 發消息,只要能發過去接受到,用什麼方法都可以 。 剛接觸chrome ,請指教,謝謝 。
|
9
aisensiy 2013-03-29 11:51:04 +08:00
https://developer.chrome.com/extensions/messaging.html
这个文档说的还是很清楚的吧,有 content to background 也有 background to content |
11
aisensiy 2013-03-29 14:22:09 +08:00
@janrone 嗯 一样的 一个是默认给你生成 background.html 一个是你主动建立 background.html
|
13
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.. 百试不爽... |
14
janrone OP |
16
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了。 |
19
ehaagwlke 2013-03-30 14:07:21 +08:00
你用这个是想实现什么呢?
如果是用content script获取tab中页面上的信息,然后发给background(一次性的连接), 可以在content script中用chrome.extension.sendMessage()发送tab里的东西, 然后在background里用chrome.extension.onMessage.addListener()来收。 |
21
shinemoon 2013-03-30 22:28:29 +08:00
@janrone 对,是long-live的连接
发过来倒不用了,就像我提到的,我大致试了下你的代码,的确会得到同样的结果,原因什么的,因为个人偏好long lived connection, 倒是没有动力去仔细挖掘:) |
23
janrone OP |