chrome 插件发送消息 遇到问题 ? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
janrone

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

  •  
  •   janrone 2013 年 3 月 28 日 14275 次点击
    这是一个创建于 4776 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 年 3 月 28 日
    receiving end does not exist.
    是你接受消息的 tab 被关掉了
    janrone
        2
    janrone  
    OP
       2013 年 3 月 28 日
    我的tab都开这着呢。 。。
    aisensiy
        3
    aisensiy  
       2013 年 3 月 28 日
    @janrone chrome.runtime 是个什么东西啊 tabs 是 chrome.tabs background 是 chrome.extension 莫非是 api 又变了?我不知道有这个唉
    jeeson
        4
    jeeson  
       2013 年 3 月 28 日
    Chrome Dev 27.x 版本吗?似乎和 Function.binding 有关
    janrone
        5
    janrone  
    OP
       2013 年 3 月 28 日
    @jeeson 不是 dev27.x
    janrone
        6
    janrone  
    OP
       2013 年 3 月 28 日
    @aisensiy 我刚接触几天 貌似之前的是request 现在是 sendMessage
    shinemoon
        7
    shinemoon  
       2013 年 3 月 29 日
    大致看了下,因为我自己一直习惯都用Port来传递消息,没有直接用你的代码,但是从API定义来看:

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

    纯纸上分析,仅做参考..
    janrone
        8
    janrone  
    OP
       2013 年 3 月 29 日
    @shinemoon 我在的是 background.JS contentscript 消息,只要能去接受到,用什方法都可以 。 接chrome ,指教, 。
    aisensiy
        9
    aisensiy  
       2013 年 3 月 29 日
    https://developer.chrome.com/extensions/messaging.html

    这个文档说的还是很清楚的吧,有 content to background 也有 background to content
    janrone
        10
    janrone  
    OP
       2013 年 3 月 29 日
    @aisensiy background.js 和 background.html 都一吧
    aisensiy
        11
    aisensiy  
       2013 年 3 月 29 日
    @janrone 嗯 一样的 一个是默认给你生成 background.html 一个是你主动建立 background.html
    janrone
        12
    janrone  
    OP
       2013 年 3 月 29 日
    @aisensiy 是同的呢 。
    shinemoon
        13
    shinemoon  
       2013 年 3 月 29 日
    @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 年 3 月 29 日
    @shinemoon 是注入tab 了,alert 有提示 。 我完了你的 1,和2 意思是也和我的一的? 是?。

    port 不用,demo, 。
    shinemoon
        15
    shinemoon  
       2013 年 3 月 29 日
    shinemoon
        16
    shinemoon  
       2013 年 3 月 29 日
    @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 年 3 月 30 日
    @shinemoon 这种是属于 Long-lived connections 吧 ?
    janrone
        18
    janrone  
    OP
       2013 年 3 月 30 日
    @shinemoon 我发你邮箱,您帮我看看。。。?
    ehaagwlke
        19
    ehaagwlke  
       2013 年 3 月 30 日
    你用这个是想实现什么呢?
    如果是用content script获取tab中页面上的信息,然后发给background(一次性的连接), 可以在content script中用chrome.extension.sendMessage()发送tab里的东西, 然后在background里用chrome.extension.onMessage.addListener()来收。
    janrone
        20
    janrone  
    OP
       2013 年 3 月 30 日
    @ehaagwlke 实现hsitory.back();
    shinemoon
        21
    shinemoon  
       2013 年 3 月 30 日
    @janrone 对,是long-live的连接

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

    呵呵 ,排名不先后。
    aisensiy
        24
    aisensiy  
       2013 年 4 月 1 日
    @janrone 唉 人还是要靠自己
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     874 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 85ms UTC 22:26 PVG 06:26 LAX 15:26 JFK 18:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86