? ? 有時(shí)需要讓擴(kuò)展中的多個(gè)頁(yè)面之間,或者不同擴(kuò)展的多個(gè)頁(yè)面之間相互傳輸數(shù)據(jù),以獲得彼此的狀態(tài)。比如音樂(lè)播放器擴(kuò)展,當(dāng)用戶鼠標(biāo)點(diǎn)擊popup頁(yè)面中的音樂(lè)列表時(shí),popup頁(yè)面應(yīng)該將用戶這個(gè)指令告知后臺(tái)頁(yè)面,之后后臺(tái)頁(yè)面開(kāi)始播放相應(yīng)的音樂(lè)。
? ? chrome 提供了4個(gè) 有關(guān)擴(kuò)展頁(yè)面間相互通信的接口,分別是runtime.sendMessage、runtime.onMessage、runtime.connect和runtime.onConnect。
? ? 接下來(lái)主要說(shuō)下runtime.sendMessage和runtime.onMessage
請(qǐng)注意,Chrome提供的大部分API是不支持在content_scripts中運(yùn)行的,但runtime.sendMessage和runtime.onMessage可以在content_scripts中運(yùn)行,所以擴(kuò)展的其他頁(yè)面也可以同content_scripts相互通信。
runtime.sendMessage完整的方法為:
? ??????????chrome.runtime.sendMessage(extensionId, message, options, callback)
extensionId為所發(fā)送消息的目標(biāo)擴(kuò)展,如果不指定這個(gè)值,則默認(rèn)為發(fā)起此消息的擴(kuò)展本身;
message為要發(fā)送的內(nèi)容,類型隨意,內(nèi)容隨意,比如可以是'Hello',也可以是{action: 'play'}、2013和['Jim', 'Tom', 'Kate']等等;
options為對(duì)象類型,包含一個(gè)值為布爾型的includeTlsChannelId屬性,此屬性的值決定擴(kuò)展發(fā)起此消息時(shí)是否要將TLS通道ID發(fā)送給監(jiān)聽(tīng)此消息的外部擴(kuò)展,這是有關(guān)加強(qiáng)用戶連接安全性的技術(shù),如果這個(gè)參數(shù)你捉摸不透,不必理睬它,options是一個(gè)可選參數(shù);
callback是回調(diào)函數(shù),用于接收返回結(jié)果,同樣是一個(gè)可選參數(shù)。
runtime.onMessage完整的方法為:
? ??????????chrome.runtime.onMessage.addListener(callback)
callback為必選參數(shù),為回調(diào)函數(shù)。
callback接收到的參數(shù)有三個(gè),分別是message、sender和sendResponse,即消息內(nèi)容、消息發(fā)送者相關(guān)信息和相應(yīng)函數(shù)。其中sender對(duì)象包含4個(gè)屬性,分別是tab、id、url和tlsChannelId,tab是發(fā)起消息的標(biāo)簽,
為了進(jìn)一步說(shuō)明,下面舉一個(gè)例子。
在popup.html中執(zhí)行如下代碼:
? ? ? ?chrome.runtime.sendMessage('Hello', function(response){
? ? ? document.write(response);
? ? ? });
在background中執(zhí)行如下代碼:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){
if(message == 'Hello'){
sendResponse('Hello from background.');
}
});
查看popup.html頁(yè)面會(huì)發(fā)現(xiàn)有輸出“Hello from background.”。