接上篇文章, 我们知道了如何定义chrome的各种入口和页面. 那如何来处理页面和入口之间的通信呢. 由于定义的页面和入口更多. 各种之间的通信尤为重要. 这里只介绍content script,popup, options, service worker, devtools之间的通信.
popup to content script
popup页面到content script之间通信很简单. 可以在popup.js中使用.chrome.tabs.sendMessage
chrome.tabs.sendMessage(tab_id, params, (ret) => {
console.log('调用一次')
console.log(ret)
});
在content script中声明事件监听就可以了. 如下.
chrome.runtime.onMessage.addListener((event, sender, callable) => {
console.log('收到popup的消息')
callable('给popup发一次消息')
})
这样就完成调用了. 当然. 你可以通过sender里面的参数来进行区别是什么事件. 结构的话可以看这篇文章. 注意content script里面的监听是所有的监听.
popup to service worker
popup-servicework也是通过上面的监听事件来进行. 如下. 首先在background.js中监听事件
chrome.runtime.onMessage.addListener((event, sender, callable) => {
console.log(event)
callable('回复一下消息')
})
然后在popup.js里面直接使用如下的方式即可调用.
chrome.runtime.sendMessage('调用后台一次', (ret) => {
console.log(ret)
})
这样就能通过事件来进行消息传递了.
content to service worker
content也是如同popup.js一样. 直接使用chrome.runtime.sendMessage来进行调用. 如下
chrome.runtime.sendMessage('content调用一次', function() {
console.log('调用成功')
})
devtools to service worker
注意. 由于devtools的特殊性. 只能调用service worker. 可以通过同popup一样的方式来进行调用.
其他情况
如果需要调用其他的情况, 例如devtools调用content里面的内容. 则需要进行中转. 使用建立长链接的方式. 首先. service worker的保留长链接. 如下.
// background.js
var last_port = null;
chrome.runtime.onConnect.addListener(function(port) {
last_port = port;
})
chrome.runtime.onMessage.addListener((event, sender, callable) => {
var cmd = event.cmd || ''
if(cmd == 'to_content') {
last_port.postMessage('来自devtools的调用')
}else{
callable(event)
}
})
content.js得连接service worker. 如下
var connect = chrome.runtime.connect()
connect.onMessage.addListener(function(msg) {
console.log('长链接调用')
console.log(msg)
})
最后. 修改panel.js
chrome.runtime.sendMessage({'cmd': 'to_content'}, function() {
console.log('调用成功')
})
即可完成调用. 这种方式比较hack. 同理,其他也是可以通过这种方式进行处理的.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。