Chrome Extensions學習

周日在家無聊狞玛,研究了下chrome的擴展程序(extensions),所謂的擴展程序其實沒那么難锭亏,基本會html慧瘤、js锅减、css的很容易上手

簡單的例子:獲取特定網(wǎng)頁上的信息伐坏,生成一維條碼圖片和預覽頁面桦沉,并打印預覽頁面

基本概念

一個應用(擴展)其實是壓縮在一起的一組文件金闽,包括HTML代芜,CSS挤庇,Javascript腳本罚随,圖片文件淘菩,還有其它任何需要的文件屠升。 應用(擴展)本質(zhì)上來說就是web頁面腹暖,它們可以使用所有的瀏覽器提供的API,從XMLHttpRequest到JSON到HTML5全都有糕殉。

應用(擴展)可以與Web頁面交互阿蝶,或者通過content script或cross-origin XMLHttpRequests與服務器交互羡洁。應用(擴展)還可以訪問瀏覽器提供的內(nèi)部功能爽丹,例如標簽或書簽等粤蝎。

應用(擴展)的界面

很多應用(不包括WebApp)會以browser action或page action的形式在瀏覽器界面上展現(xiàn)出來初澎。每個應用(擴展)最多可以有一個browser action或page action。當應用(擴展)的圖標是否顯示出來是取決于單個的頁面時卧檐,應當選擇page action焰宣;當其它情況時可以選擇browser action匕积。

應用也可以通過其它方式提供界面,比如加入到上下文菜單盅粪,提供一個選項頁面或者用一個content script改變頁面的顯示等票顾〉旖荆可以在"開發(fā)指南"中找到應用(擴展)特性的完整列表以及實現(xiàn)的細節(jié)含鳞。

文件

每個應用(擴展)都應該包含下面的文件:

  • 一個manifest文件
  • 一個或多個html文件(除非這個應用是一個皮膚)
  • 可選的一個或多個javascript文件
  • 可選的任何需要的其他文件芹务,例如圖片

在開發(fā)應用(擴展)時枣抱,需要把這些文件都放到同一個目錄下。發(fā)布應用(擴展)時磁滚,這個目錄全部打包到一個應用(擴展)名是.crx的壓縮文件中。如果使用Chrome Developer Dashboard,上傳應用(擴展)淤刃,可以自動生成.crx文件吱型。

引用文件

任何需要的文件都可以放到應用(擴展)中,但是怎么使用它們呢灼伤?一般的說狐赡,可以像在普通的HTML文件中那樣使用相對地址來引用一個文件颖侄。下面的例子演示了如何引用images子目錄下的文件myimage.png
![](images/myimage.png)
如果使用chrome開發(fā)者工具享郊,可以看到每一個應用(擴展)中的文件也可以用一個絕對路徑來表示:
chrome-extension://<extensionID>/<pathToFile>
在這個URL中炊琉,是為每一個應用(擴展)生成的唯一ID。從chrome://extensions頁面中可以看到已經(jīng)安裝的所有應用(擴展)的唯一ID玄货。是文件在應用(擴展)目錄下的路徑松捉,也就是它的相對路徑馆里。
在這個URL中鸠踪,名為manifest.json的文件包含了應用(擴展)的基本信息,例如最重要的文件列表械媒,應用(擴展)所需要的權(quán)限等评汰。

基本架構(gòu)

絕大多數(shù)應用(擴展)都包含一個背景頁面(background page),用來執(zhí)行應用(擴展)的主要功能主儡。

上圖顯示了安裝了兩個應用(擴展)的瀏覽器糜值。兩個應用(擴展)分別是黃色圖標代表的browser action和藍色圖標代表的page action寂汇。在background.html文件里定義了browser action和javascript代碼。在兩個窗口里browser action都可以工作停巷。

頁面

背景頁面并不是應用(擴展)中唯一的頁面累贤。例如臼膏,一個browser action可以包含一個彈窗(popup),而彈窗就是用html頁面實現(xiàn)的嚷硫。應用(擴展)還可以使用chrome.tabs.create()或者window.open()來顯示內(nèi)部的HTML文件仔掸。

應用(擴展)里面的HTML頁面可以互相訪問各自DOM樹中的全部元素起暮,或者互相調(diào)用其中的函數(shù)会烙。

下圖顯示了一個browser action的彈窗的架構(gòu)。彈窗的內(nèi)容是由HTML文件(popup.html)定義的web頁面纸厉。它不必復制背景頁面(background.html)里的代碼,因為它可以直接調(diào)用背景頁面中的函數(shù)颗品。

Content scripts

如果一個應用(擴展)需要與web頁面交互躯枢,那么就需要使用一個content script闺金。Content script腳本是指能夠在瀏覽器已經(jīng)加載的頁面內(nèi)部運行的javascript腳本峰档〖パ玻可以將content script看作是網(wǎng)頁的一部分,而不是它所在的應用(擴展)的一部分槽棍。

Content script可以獲得瀏覽器所訪問的web頁面的詳細信息炼七,并可以對頁面做出修改布持。下圖顯示了一個content script可以讀取并修改當前頁面的DOM樹。但是它并不能修改它所在應用(擴展)的背景頁面的DOM樹按傅。

Content script與它所在的應用(擴展)并不是完全沒有聯(lián)系唯绍。一個content script腳本可以與所在的應用(擴展)交換消息枝誊,如下圖所示叶撒。例如,當一個content script從頁面中發(fā)現(xiàn)一個RSS種子時皮壁,它可以發(fā)送一條消息蛾魄〉涡耄或者由背景頁面發(fā)送一條消息,要求content script修改一個網(wǎng)頁的內(nèi)容扔水。

頁面間的通信

一個應用(擴展)中的HTML頁面間經(jīng)常需要互相通信主届。由于一個應用(擴展)的所有頁面是在同一個進程的同一個線程中運行的待德,因此它們之間可以直接互相調(diào)用各自的函數(shù)将宪。

可以使用chrome.extension中的方法來獲取應用(擴展)中的頁面较坛,例如getViews()和getBackgroundPage()。一旦一個頁面得到了對應用(擴展)中其它頁面的引用华嘹,它就可以調(diào)用被引用頁面中的函數(shù)除呵,并操作被引用頁面的DOM樹颜曾。

保存數(shù)據(jù)和隱身模式

應用(擴展)可以使用HTML5的 Web Storage API(例如localStorage)來保存數(shù)據(jù)泛豪,或者向服務器發(fā)出請求來保存數(shù)據(jù)侦鹏。當需要保存數(shù)據(jù)的時候略水,首先需要確定是否從隱身模式窗口中發(fā)出的請求。缺省情況下慎璧,應用(擴展)是不會運行在隱身模式下的胸私,而webapp是會的鳖谈。需要明確用戶在隱身模式下究竟需要應用(擴展)或webapp做什么缆娃。

隱身模式保證在該窗口下瀏覽不會留下痕跡瑰排。當處理隱身窗口的數(shù)據(jù)時凶伙,一定要遵循這個前提。例如显押,如果一個的應用(擴展)的功能是將瀏覽歷史保存在云端(服務器)乘碑,那么不要保存隱身模式下的瀏覽歷史兽肤。另一方面,任何窗口下都可以保存應用(擴展)的數(shù)據(jù)电禀,不論是否隱身尖飞。
重要規(guī)則:如果一條數(shù)據(jù)可能表明用戶在網(wǎng)上看了什么或做了什么政基,不要在隱身模式下保存它闹啦。

要檢查窗口是否在隱身模式下沮明,檢查Tab或Window對象的incognito屬性。例如:

var bgPage = chrome.extension.getBackgroundPage();

function saveTabData(tab, data) {
    if (tab.incognito) {
        bgPage[tab.url] = data; // Persist data ONLY in memory
    } else {
        localStorage[tab.url] = data; // OK to store data
    }
}

具體實現(xiàn)思路

//manifest.json
{
    "manifest_version": 2,
    "name": "條碼打印插件",
    "version": "0.0.1",
    "background": {
        //"page":"background.html"
        "scripts": ["jquery2.1.1.min.js", "background.js"]
    },
    "page_action": {
        "default_icon": {
            "19": "cnblogs_19.png",
            "38": "cnblogs_38.png"
        },
        "default_title": "條碼預覽", // shown in tooltip
        "default_popup": "popup.html"
    },
    "permissions": ["tabs", "http://localhost/"],
    "content_scripts": [{
        "matches": ["http://localhost/*"],
        "js": ["jquery2.1.1.min.js", "content_script.js"]
    }]
}

content獲取頁面的數(shù)據(jù)窍奋,傳給background荐健,popup從background獲取信息并生成條碼和預覽頁面,打印popup

但實際做的過程中發(fā)現(xiàn)费变,popup頁面無法調(diào)用打印函數(shù)print();網(wǎng)上查閱資料未果摧扇。

于是換種思路,數(shù)據(jù)可以傳給服務器挚歧,由服務器生成打印頁面扛稽。

翻閱文檔,發(fā)現(xiàn)還可以覆寫特定頁面滑负,這樣連服務端也省了在张。

Override替代頁

使用替代頁,可以將Chrome默認的一些特定頁面替換掉,改為使用擴展提供的頁面。這讓擴展開發(fā)者可以開發(fā)更多有趣或者實用的基本功能頁面虽惭。替代頁通常會有大量的CSS和JavaScript代碼。

擴展可以替代如下頁面:

  • 書簽管理器:從工具菜單上點擊書簽管理器時訪問的頁面,或者從地址欄直接輸入 chrome://bookmarks

  • 歷史記錄:從工具菜單上點擊歷史記錄時訪問的頁面,或者從地址欄直接輸入 chrome://history傀蚌。

  • 新標簽頁:當創(chuàng)建新標簽的時候訪問的頁面库继,或者從地址欄直接輸入 chrome://newtab

  • 注意:一個擴展只能替代一個頁面。

  • 注意:如果你替代隱身窗口的頁面藤抡,請注意要在manifest中將 incognito 屬性指定為 "spanning"。

  • 注意:你不能替代隱身窗口的新標簽頁。

Manifest

下面是在extension manifest中注冊替代頁的寫法。

{
  "name": "My extension",
  ...
 
  "chrome_url_overrides" : {
    "pageToOverride": "myPage.html"
  },
  ...
}

對于示例中的pageToOverride颊埃,可替換成如下關(guān)鍵字

  • bookmarks
  • history
  • newtab

未完待續(xù)…… to be continued

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罗标,一起剝皮案震驚了整個濱河市竿拆,隨后出現(xiàn)的幾起案子谢澈,更是在濱河造成了極大的恐慌敬鬓,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砌创,死亡現(xiàn)場離奇詭異,居然都是意外死亡晃洒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門朦佩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颅筋,“玉大人桃熄,你說我怎么就攤上這事厢汹。” “怎么了兑巾?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵素标,是天一觀的道長。 經(jīng)常有香客問我实抡,道長六水,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮梢什,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腊尚。我一直安慰自己,他們只是感情好坟桅,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布幢泼。 她就那樣靜靜地躺著,像睡著了一般触趴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上食零,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音,去河邊找鬼怎炊。 笑死,一個胖子當著我的面吹牛盹廷,可吹牛的內(nèi)容都是我干的俄占。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼鹰贵,長吁一口氣:“原來是場噩夢啊……” “哼亭珍!你這毒婦竟也來了辆毡?” 一聲冷哼從身側(cè)響起共螺,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎情竹,沒想到半個月后已艰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杉编,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡倔喂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年恢氯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱州。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡挑秉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苔货,到底是詐尸還是另有隱情衷模,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布蒲赂,位于F島的核電站,受9級特大地震影響刁憋,放射性物質(zhì)發(fā)生泄漏滥嘴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一至耻、第九天 我趴在偏房一處隱蔽的房頂上張望若皱。 院中可真熱鬧镊叁,春花似錦、人聲如沸走触。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽互广。三九已至敛腌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惫皱,已是汗流浹背像樊。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旅敷,地道東北人生棍。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像媳谁,于是被迫代替她去往敵國和親涂滴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • chrome擴展開發(fā)入門教程 最近在開發(fā)chrome插件晴音,看到一篇非常適合入門的教程柔纵,特記錄一下 注:轉(zhuǎn)載 本文首...
    謝大見閱讀 6,419評論 1 25
  • Chrome擴展開發(fā) 標簽(空格分隔): Chrome擴展 1、寫在前面 Chrome插件是一個用Web技術(shù)開發(fā)...
    記憶的時間差閱讀 6,027評論 0 15
  • 架構(gòu) 總括:Manifest:程序清單Background:插件運行環(huán)境/主程序Pop up:彈出頁面Conten...
    程序員小逗逼閱讀 10,342評論 2 18
  • 夏天業(yè)務很是清淡段多,辦公室安靜得很首量,一天到晚電話響不了兩聲,接起來一聽进苍,大多數(shù)是推銷業(yè)務的電話加缘,有氣無力但任裝成很熱...
    谷雨后是夏天閱讀 181評論 0 0
  • 據(jù)說,最讓人討厭的話觉啊,排在第一的是“隨便”拣宏,第二的就是“我是為你好”。暫且不論這個結(jié)論是否科學杠人。但是勋乾,每當我們下定...
    木南Ruan閱讀 106評論 0 0