V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
janrone
V2EX  ›  程序员

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

  •  
  •   janrone · 2013-03-28 17:43:44 +08:00 · 13642 次点击
    这是一个创建于 4040 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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.
    24 条回复    1970-01-01 08:00:00 +08:00
    aisensiy
        1
    aisensiy  
       2013-03-28 17:52:24 +08:00
    receiving end does not exist.
    是你接受消息的 tab 被关掉了
    janrone
        2
    janrone  
    OP
       2013-03-28 18:17:38 +08:00
    我的tab都开这着呢。 。。
    aisensiy
        3
    aisensiy  
       2013-03-28 18:22:35 +08:00
    @janrone chrome.runtime 是个什么东西啊 tabs 是 chrome.tabs background 是 chrome.extension 莫非是 api 又变了?我不知道有这个唉
    jeeson
        4
    jeeson  
       2013-03-28 19:05:42 +08:00
    Chrome Dev 27.x 版本吗?似乎和 Function.binding 有关
    janrone
        5
    janrone  
    OP
       2013-03-28 21:48:14 +08:00
    @jeeson 不是 dev27.x
    janrone
        6
    janrone  
    OP
       2013-03-28 21:49:20 +08:00
    @aisensiy 我刚接触几天 貌似之前的是request 现在是 sendMessage
    shinemoon
        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或者扩展其他页面的消息的....

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

    这个文档说的还是很清楚的吧,有 content to background 也有 background to content
    janrone
        10
    janrone  
    OP
       2013-03-29 14:19:36 +08:00
    @aisensiy background.js 和 background.html 應該都一樣吧
    aisensiy
        11
    aisensiy  
       2013-03-29 14:22:09 +08:00
    @janrone 嗯 一样的 一个是默认给你生成 background.html 一个是你主动建立 background.html
    janrone
        12
    janrone  
    OP
       2013-03-29 14:34:24 +08:00
    @aisensiy 還是同樣的錯誤呢 。
    shinemoon
        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.. 百试不爽...
    janrone
        14
    janrone  
    OP
       2013-03-29 18:36:59 +08:00
    @shinemoon 是注入tab 了,alert 有提示 。 我完了你的 1,和2 意思是也和我的錯誤一樣的唄? 還是?。

    port 不會用,給發個demo唄,謝謝 。
    shinemoon
        15
    shinemoon  
       2013-03-29 23:08:24 +08:00
    shinemoon
        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了。
    janrone
        17
    janrone  
    OP
       2013-03-30 10:31:04 +08:00
    @shinemoon 这种是属于 Long-lived connections 吧 ?
    janrone
        18
    janrone  
    OP
       2013-03-30 11:14:34 +08:00
    @shinemoon 我发你邮箱,您帮我看看。。。?
    ehaagwlke
        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()来收。
    janrone
        20
    janrone  
    OP
       2013-03-30 17:52:19 +08:00
    @ehaagwlke 实现hsitory.back();
    shinemoon
        21
    shinemoon  
       2013-03-30 22:28:29 +08:00
    @janrone 对,是long-live的连接

    发过来倒不用了,就像我提到的,我大致试了下你的代码,的确会得到同样的结果,原因什么的,因为个人偏好long lived connection, 倒是没有动力去仔细挖掘:)
    janrone
        22
    janrone  
    OP
       2013-03-31 09:57:30 +08:00
    janrone
        23
    janrone  
    OP
       2013-03-31 15:07:27 +08:00
    修改了manifest中 background 的内容,用之前的方法 chrome.extension.onRequest.addListener
    chrome.tabs.sendRequest 和 chrome.extension.sendRequest
    完成了content 和 background之间的消息传递 。
    至于一开始提到的方法暂先不用了,搞不明白 。
    最后谢谢
    @shinemoon
    @ehaagwlke
    @aisensiy

    呵呵 ,排名不先后。
    aisensiy
        24
    aisensiy  
       2013-04-01 13:26:07 +08:00
    @janrone 唉 人还是要靠自己
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2874 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 14:28 · PVG 22:28 · LAX 07:28 · JFK 10:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.