谷歌浏览器扩展开发笔记
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1,參考https://www.cnblogs.com/ligerleng/p/gmail_assist_1.html
2,知識(shí)點(diǎn):
page_action": 與之平級(jí)的還有另一個(gè)字段"browser_action",你的manifest中最多出現(xiàn)二者之一。直觀地來(lái)說(shuō),這倆屬性分別指明你的擴(kuò)展在特定網(wǎng)頁(yè)中才能用,還是打開(kāi)瀏覽器后一直能用。更直觀的就是,你的擴(kuò)展的圖標(biāo)出現(xiàn)的位置不同,如下圖。
"background": 你的擴(kuò)展如果需要什么在后臺(tái)持續(xù)運(yùn)行的部分,就可以通過(guò)這個(gè)字段來(lái)指出。不僅是js,你還可以指定一個(gè)自己編寫(xiě)的html,像這樣:
"background": {"page": "background.html","scripts": ["background.js"],"persistent": false } 如果僅僅指定js,chrome會(huì)自己生成一個(gè)html來(lái)在后臺(tái)跑你指定的腳本;當(dāng)然如果指定了你自己寫(xiě)的html,它也不會(huì)顯示出來(lái)。
"persistent"值默認(rèn)為true。為true時(shí),你在background字段中指出的js腳本(注意格式是數(shù)組,因而可以有多個(gè)腳本)將持續(xù)運(yùn)行在后臺(tái),而若persistent為false,則這些腳本將只在事件活動(dòng)時(shí)運(yùn)行,事件不活動(dòng)時(shí)就會(huì)釋放其占有的內(nèi)存等資源。
那么在Chrome擴(kuò)展中運(yùn)行的腳本有哪些呢?我的理解是大致有這么四類:background、popup頁(yè)面內(nèi)的js、content script、injected js。
injected:
這種腳本,和原網(wǎng)頁(yè)自帶的腳本,就完全是一路貨了。
var s = document.createElement('script');
s.src = chrome.extension.getURL('tableInited.js');
s.onload = function() {
? ? this.parentNode.removeChild(this);
};
(document.head || document.documentElement).appendChild(s);
要注入的inject.js需要在manifest中的web_accessible_resources字段里進(jìn)行聲明。
"web_accessible_resources" : [
? ? ? ? "oauth2/oauth2.html",
? ? ? ? "js/tableInited.js",
? ? ? ? "css/style.css",
? ? ? ? "js/table_sort_script.js",
? ? ? ? "images/sort.gif",
? ]
只有網(wǎng)頁(yè)通用的API是可用的,而chrome為擴(kuò)展提供的API(chrome.*),這種完全注入到用戶瀏覽的頁(yè)面中的腳本都不能訪問(wèn)。
- 何時(shí)使用
我的建議是,僅當(dāng)你需要獲取被瀏覽頁(yè)面中原有js中的變量時(shí),才把你的腳本inject到用戶瀏覽的頁(yè)面中,然后通過(guò)接下來(lái)例子里這種方式,把它傳到content script中。當(dāng)然了,有一些單純地操縱DOM元素而不需要它們?cè)俜祷厥裁磾?shù)據(jù)的腳本,也可以直接inject到頁(yè)面里
2.content script
而是運(yùn)行在一個(gè)單獨(dú)的被隔離的環(huán)境中。它的生存周期也就是跟瀏覽的網(wǎng)頁(yè)一樣,最遲到網(wǎng)頁(yè)加載完全完成時(shí),content script就開(kāi)始跑了,直到用戶當(dāng)前瀏覽的網(wǎng)頁(yè)被關(guān)閉。每次刷新時(shí)將重新載入。
- 網(wǎng)頁(yè)通用的API,跨域xhr請(qǐng)求,以及chrome為擴(kuò)展程序提供的API中的一部分
- 何時(shí)使用
-
需要操縱頁(yè)面DOM時(shí),需要與具體頁(yè)面匹配時(shí),需要接受injected js傳出來(lái)的數(shù)據(jù)時(shí),以及每次刷新網(wǎng)頁(yè)都需要重新載入的腳本,就可以作為content script來(lái)寫(xiě)。
- 例子
-
向gmail服務(wù)器發(fā)xhr請(qǐng)求數(shù)據(jù)、操縱gmail頁(yè)面的DOM,把返回的數(shù)據(jù)顯示出來(lái)。
3.popup
- 可用API范圍
這類腳本和下一類(background),我都稱為“完全屬于擴(kuò)展程序的腳本”。它們不僅可以訪問(wèn)普通網(wǎng)頁(yè)API、可以發(fā)起跨域xhr請(qǐng)求,而且可以訪問(wèn)chrome為擴(kuò)展程序?qū)iT(mén)提供的API(即chrome.*)中的全部。
?
4.跑在后臺(tái)(background)頁(yè)面中的腳本
所謂的后臺(tái)腳本,在chrome擴(kuò)展中又分為兩類,分別運(yùn)行于后臺(tái)頁(yè)面(background page)和事件頁(yè)面(event page)中。兩者區(qū)別在于,前者(后臺(tái)頁(yè)面)持續(xù)運(yùn)行,生存周期和瀏覽器相同,即從打開(kāi)瀏覽器到關(guān)閉瀏覽器期間,后臺(tái)腳本一直在運(yùn)行,一直占據(jù)著內(nèi)存等系統(tǒng)資源;而后者(事件頁(yè)面)只在需要活動(dòng)時(shí)活動(dòng),在完全不活動(dòng)的狀態(tài)持續(xù)幾秒后,chrome將會(huì)終止其運(yùn)行,從而釋放其占據(jù)的系統(tǒng)資源,而在再次有事件需要后臺(tái)腳本來(lái)處理時(shí),重新載入它。這兩類咋區(qū)分呢?通過(guò)你在manifest中的聲明:
"background": {"scripts": ["background.js"],"persistent": false },正如上一節(jié)說(shuō)過(guò)的,這里persistent的值默認(rèn)是true,此時(shí)這個(gè)js就是運(yùn)行在后臺(tái)頁(yè)面的(持續(xù)的);若這個(gè)值為false,那就是事件頁(yè)面(非持續(xù)的)了。
- 何時(shí)使用
需要持續(xù)運(yùn)行在后臺(tái)的,肯定就選這種了,而且要把persistent置為true。需要在后臺(tái)處理些事件啊之類的,包括要用到content script無(wú)法訪問(wèn)的擴(kuò)展程序?qū)S肁PI們時(shí),也應(yīng)該用這種,不過(guò)只要你不是需要它必須持續(xù)運(yùn)行的,就把它設(shè)置成事件頁(yè)面,從而提高性能。
?
?
轉(zhuǎn)載于:https://my.oschina.net/u/2367514/blog/1926516
總結(jié)
以上是生活随笔為你收集整理的谷歌浏览器扩展开发笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C#windows服务开发
- 下一篇: 2017年html5行业报告,云适配发布