chrome插件开发遇到的问题

做一个chrome插件遇到一个bug,
向页面注入了一个content_script叫content.js和一个iframe,这个iframe里面script引用了一个iframe.js

现在有这样三段代码:
1 background.js

//主要用于iframe.js与content.js通信
chrome.runtime.onMessage.addListener(function (request, sender, cb) {
    chrome.tabs.sendMessage(sender.tab.id, request, cb);
});

2 content.js

SelectorGadget.prototype.addCaptureData = function (capData) {
     // -------这里打印 “发送”
     console.log("发送:"+capData);
     chrome.runtime.sendMessage({type: "addCaptureData", data: capData});       
};

3 iframe.js

 chrome.runtime.onMessage.addListener(function (request, sender, cb) {
        if (request.type === "setCaptureSelectorText") {
            VM.pageEleCssSelector = request.data;
        }
        else if (request.type === "setPageSelectorText") {
            VM.pageEleCssSelector = request.data;
        }
        else if (request.type === "addCaptureData") {
            // -----这里打印 “收到”
            console.log("收到:"+request.data);
            VM.capturedData=VM.capturedData.concat(request.data);
        }
        else if (request.type === "clearAllCapture") {
            VM.capturedData = [];
        }
    })

然后bug来了,在控制台打印了一次发送,却有两次收到,
clipboard.png
我可以肯定不是重复执行了事件,但不知道为什么明明只发送了一次却收到了两次,是不是因为background.js做了中转导致的?

阅读 3.4k
2 个回答

content.js发送一次,被iframe接收到, background.js发送一次,又被iframe接收到。 所以打印两次了。
可以看下官方文档:https://developer.chrome.com/...
貌似每一个frame发送的message都会被onMessage监听到。

clipboard.png

我最近也在写插件,功能比较复杂,需要同时注入好几个不同站点。通信的时候用了一个叫做react-chrome-redux的库。还是挺好用的。
中间也遇到过你这样的重复接收,不过原因是我用了很多name一样的store导致的,后来给每个action加了一个ID,接收的时候去了一下重

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题