我正在實(shí)現(xiàn)一個(gè)Chrome瀏覽器擴(kuò)展來解析某社交網(wǎng)站的數(shù)據(jù)(也就是扒網(wǎng)頁)。點(diǎn)擊擴(kuò)展的圖標(biāo),它將會(huì)pop up出一個(gè)氣泡窗口,上面顯示當(dāng)前解析的結(jié)果。解析的工作由content page的一個(gè)javascript腳本負(fù)責(zé)。更具體的數(shù)據(jù)流程是:點(diǎn)擊圖標(biāo)出現(xiàn)氣泡窗口(popup.html),氣泡窗口的javascript腳本(popup.js)將發(fā)送一個(gè)消息給content page的腳本(content.js),content.js計(jì)算解析content page(即社交網(wǎng)站)得到結(jié)果,將其通過消息回調(diào)函數(shù)返回給popup.js,然后popup.js再把結(jié)果顯示到popup.html上,氣泡窗口上就能看到扒網(wǎng)頁的結(jié)果了。 這里消息的發(fā)送方popup.js使用了chrome.tabs.query函數(shù)和chrome.tabs.sendMessage函數(shù),具體代碼如下:
chrome.tabs.query函數(shù)用來定位當(dāng)前標(biāo)簽頁,因?yàn)閏hrome.tabs.sendMessage需要明確指出消息發(fā)送給誰(第一個(gè)參數(shù))。消息的內(nèi)容是第二個(gè)參數(shù),一個(gè)json對(duì)象。 方法體里面的三行其實(shí)是回調(diào)函數(shù)的內(nèi)容,也就是popup.js得到content.js的回復(fù)后執(zhí)行的操作:將結(jié)果添加到氣泡窗口popup.html中。需要指出的是谷歌官方的開發(fā)文檔和示例里用的是chrome.tabs.getSelected函數(shù)和chrome.extension.sendRequest函數(shù),這兩個(gè)函數(shù)在新的Chrome里已經(jīng)廢棄了。 消息的接收方content.js實(shí)現(xiàn)了消息監(jiān)聽器,具體代碼如下:
和前述一樣,監(jiān)聽器從前用chrome.extension.onRequest,現(xiàn)在用chrome.extension.onMessage。 其實(shí)消息只是發(fā)送給了該擴(kuò)展的content page,并沒有指出是哪個(gè)腳本。如果有多個(gè)腳本的話,誰實(shí)現(xiàn)了onMessage監(jiān)聽器誰就能接收到消息。如果多個(gè)腳本都實(shí)現(xiàn)了onMessage監(jiān)聽器呢?那就不知道誰會(huì)搶到了,應(yīng)該只有一個(gè)監(jiān)聽器能得到消息吧,因?yàn)檫@種實(shí)現(xiàn)消息傳遞的方法是一次性的,用過即銷毀。若要長期連接,還得用port對(duì)象和connect函數(shù)。 |
|