Chrome擴充套件外掛開發之通訊方式
阿新 • • 發佈:2021-11-11
[Chrome擴充套件外掛開發之通訊方式 - 掘金](https://juejin.cn/post/6994731393263599653 )]
概述
Chrome擴充套件外掛涉及到部分可以分為web
頁面、popup
、background
、content-script
四個部分,其中web
頁面不屬於外掛的內容,但有些時候頁面存在需要與外掛互動的場景,因此這裡把頁面與外掛之間的通訊也一併討論。
需要注意的是,popup
和background
都是執行在外掛上下文中,而content-script
則是執行在web
頁面的上下文中的。因此,在這裡我把擴充套件外掛的通訊分為以下幾種情景:
- 外掛內部指令碼的通訊:
popup
background
之間的通訊; web
頁面與content-script
的通訊;- 外掛內部指令碼與
content-script
之間的通訊。
下面對以上幾種情景進行詳細描述。
popup
與background
通訊
由於兩者執行在同一上下文中,理論上,只要得到了對方的window
物件,便可以隨意互相訪問,因此對於這兩者之間的通訊,直接事例演示~
background.js
var popup = chrome.extension.getViews({ type: "popup" })[0]
// 為所欲為
popup.GetMessageFromBackground("給我的兄弟popup點東西~")
function GetMessageFromPopup(data){
console.log("popup給我的東西~",data)
}
複製程式碼
popup.js
var background = chrome.extension.getBackgroundPage(); // 得到background頁的windows物件
// 接下來為所欲為~
background.GetMessageFromPopup("給我的兄弟background點東西")
function GetMessageFromBackground(data){
console.log("background給我的東西~",data)
}
複製程式碼
web
頁面與content-script
通訊
這兩兄弟之間的通訊也比較簡單,通過window.addEventListener
window.postMessage
即可完成,給上示例
// 接收端
window.addEventListener("message",function(ev){
console.log(ev.data)
})
// 傳送端
window.postMessage(data,"*")
複製程式碼
外掛內部指令碼與content-script
通訊
這兩者之間的通訊則是通過chrome提供的api
chrome.runtime.sendMessage\chrome.runtime.onMessage.addListener
進行,兩者之間可以互相接發訊息,但需要注意的是,當前者向後者傳送訊息時,是通過chrome.tabs.sendMessage
這個api
,示例如下:
接收端
chrome.runtime.onMessage.addListener(function (msg, sender, response) {
console.log(msg, sender);
response();
});
複製程式碼
content-script
向外掛內部指令碼傳送
chrome.runtime.sendMessage("data", function () {
console.log("收到響應");
});
複製程式碼
外掛內部指令碼向content-script
傳送
chrome.tabs.sendMessage(tabId, "data", function () {
console.log("收到響應");
})