用來向您的瀏覽器添加新功能並個性化您的瀏覽體驗的小程序。css
chrome
擴展程序是 HTML\JS\CSS\images
和其餘能夠在 web
頁面中使用的資源的壓縮包,能夠加強 chrome
瀏覽器功能或定製瀏覽體驗。html
chrome 擴展程序本質上是網頁,可使用瀏覽器爲網頁提供的全部 API
。web
首先咱們來看下擴展程序的主要的幾個名詞chrome
manifest.json
擴展文件都會有一個 mainfest
清單文件 清單文件必需要命名爲 manifest.json
,爲瀏覽器提供擴展程序的相關信息,好比使用了哪些文件和該擴展程序可使用哪些功能。json
一個基本的 mainfest
文件結構以下(用於一個瀏覽器按鈕,它將會訪問來自 google.com
的信息)canvas
{
"name": "My Extension",
"version": "2.1",
"description": "Gets information from Google.",
"icons": {
"128": "icon_16.png",
"128": "icon_32.png",
"128": "icon_48.png",
"128": "icon_128.png"
},
"background": {
"persistent": false,
"scripts": ["background_script.js"]
},
"permissions": ["https://*.google.com/", "activeTab"],
"browser_action": {
"default_icon": "icon_16.png",
"default_popup": "popup.html"
}
}
複製代碼
background script
後臺腳本是擴展程序的事件處理程序,其中包含擴展程序的事件監聽器,能夠在後臺運行,只在須要時才加載,在空閒時不加載。 特色:小程序
Javascript
文件老是運行在後臺.Chrome
應用程序級別命令的訪問權限。Chrome API
的權限UI Elements
用戶界面應該在不分散用戶注意力的前提下自定義或加強瀏覽體驗,不該該有過多的內容,儘量的少而精。。api
擴展程序都有一個後臺網頁( background.html
)包含主要邏輯的不可見頁面,擴展程序也能夠包含其餘頁面,來展現擴展程序的用戶頁面。瀏覽器
瀏覽器按鈕
或
頁面按鈕
的形式向
Google Chrome
瀏覽器增長用戶界面,每一個擴展程序最多能有一個瀏覽器按鈕或頁面按鈕。 當擴展程序與大部分網頁相關時選擇使用瀏覽器按鈕,當擴展程序的圖標顯示仍是消失取決於具體網頁時選擇使用頁面按鈕。
瀏覽器按鈕(browser_action
)和頁面按鈕(page_action
)的區別在於,瀏覽器按鈕常駐右上角工具欄,頁面按鈕能夠控制顯示仍是隱藏(置灰)。安全
chrome
瀏覽器的地址欄)或者建立快捷鍵。
擴展程序的 UI
頁面,好比彈出框 popup
,是包含 JavaScript
的普通 HTML
頁面(popup.html
)。
使用頁面按鈕和彈出窗口(popup
)的擴展程序可使用 declarative content
API在後臺腳本(background.js
)中設置規則,以供用戶肯定彈出窗口什麼時候可用。 知足條件後,後臺腳本會與彈出窗口進行通訊,以使用戶能夠點擊其圖標。
content script
若是擴展程序須要與用戶加載的網頁交互,那麼必須要使用內容腳本。內容腳本能夠修改網頁。
內容腳本中是一些 JS
代碼,在已加載到瀏覽器的頁面的上下文中執行,能夠讀取和修改瀏覽器訪問的網頁的 DOM
。應該將內容腳本視爲已加載網頁的一部分,而不是擴展程序的一部分。
內容腳本能夠經過通訊並使用 存儲API 來與其父擴展進行通訊。
特色:
frame
也沒有訪問權限;這是由於安全限制。Content scripts
運行在介於插件和頁面之間,全局的window對象是和頁面/插件全局命名空間徹底不一樣的。option page
就像擴展程序容許用戶自定義 Chrome
瀏覽器同樣,選項頁面也能夠自定義擴展程序。 選項可用於啓用功能,並容許用戶選擇與他們的需求相關的功能。
chrome
擴展程序咱們作一個給制定頁面(developer.chrome.com
)更換背景顏色的 chrome
擴展程序。
.
├── background.js
├── images
│ ├── get_started128.png
│ ├── get_started16.png
│ ├── get_started32.png
│ └── get_started48.png
├── manifest.json
├── popup.html
└── popup.js
複製代碼
mainfest
清單文件擴展程序從清單文件開始,咱們統一命名爲 mainfest.json
{
"name": "Getting Started Example",
"version": "1.0",
"description": "Build an Extension!",
"manifest_version": 2
}
複製代碼
雖然擴展程序已經安裝了,可是什麼內容都尚未,咱們先來完成後臺腳本。 在 mainfest.json
中的 background
字段中添加腳本文件的文件名 background.js
{
"name": "Getting Started Example",
"version": "1.0",
"description": "Build an Extension!",
"background": {
"scripts": ["background.js"],
"persistent": false
},
"manifest_version": 2
}
複製代碼
擴展程序會掃描註冊文件中須要偵聽的重要事件。
在 background.js
文件中加入 runtime.onInstalled
onInstalled
監聽器,而後使用 storage API
在全局存儲一個 color
變量
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
chrome.runtime.onInstalled.addListener(function() {
chrome.storage.sync.set({color: '#3aa757'}, function() {
console.log("The color is green.");
});
});
複製代碼
由於咱們使用了 storage API
,因此必須在 mainfest.json
文件中註冊後才能使用
"permissions": ["storage"],
複製代碼
而後咱們在擴展程序的管理頁面點擊刷新按鈕就能夠從新載入擴展程序。
點擊查看視圖後面的 背景頁 連接,就能夠打開一個新的瀏覽器檢查頁面,控制檯有咱們剛剛 console
的 log The color is green
. 這個就是上文提到的沒有頁面的後臺頁面。
擴展程序能夠有不少種引入用戶頁面的方式,這裏咱們使用的是彈出窗 popup
。 在 mainfest.json
中的 page_action
字段中添加 "default_popup"
字段和 default_icon
字段添加 icon
(相對路徑引入,再也不贅述) 能夠提供要在 chrome
中使用的任意大小的圖標,而後 chrome
會選擇最接近的圖標並將其縮放爲適當的大小,以填充16個浸入空間。
可是,若是未提供確切的大小,則此縮放比例可能致使圖標丟失細節或顯得模糊。 icon
的能夠經過兩種方式設置,一種是靜態圖片,另外一種是 canvas
。使用靜態圖片更加簡單,可是使用 canvas
能夠增長動效。
靜態圖片只要是 WebKit
能夠展現的圖片就能夠,能夠是 BMP, GIF, ICO, JPEG, PNG
。可是對於未壓縮的擴展程序,只能是 PNG
的。
{
"name": "Getting Started Example",
"version": "1.0",
"description": "Build an Extension!",
"background": {
"scripts": ["background.js"],
"persistent": false
},
"page_action": {
"default_popup": "popup.html",
"default_icon": {
"16": "images/get_started16.png",
"32": "images/get_started32.png",
"48": "images/get_started48.png",
"128": "images/get_started128.png"
}
},
"manifest_version": 2
}
複製代碼
該 html 文件內容以下,最基礎的一個 html 文件,只包含一個 button 按鈕,咱們的目的是點擊這個按鈕,改變網頁的背景顏色。
<!DOCTYPE html>
<html>
<head>
<style> button { height: 30px; width: 30px; outline: none; } </style>
</head>
<body>
<button id="changeColor"></button>
</body>
</html>
複製代碼
而後咱們在 後臺腳本增長一條展現規則:在 host
等於 developer.chrome.com
時展現 popup
的頁面。由於使用了 declaractiveContent api
,因此咱們還須要在腳本文件中註冊下權限。
聲明式內容 API 容許您根據網頁的 URL 和它的內容匹配的 CSS 選擇器來顯示您的擴展程序的頁面按鈕,而不須要擁有主機權限或插入內容腳本。
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
chrome.runtime.onInstalled.addListener(function() {
chrome.storage.sync.set({color: '#3aa757'}, function() {
console.log("The color is green.");
});
chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
chrome.declarativeContent.onPageChanged.addRules([{
conditions: [new chrome.declarativeContent.PageStateMatcher({
pageUrl: {hostEquals: 'developer.chrome.com'},
})
],
actions: [new chrome.declarativeContent.ShowPageAction()]
}]);
});
});
複製代碼
從新加載後你會發展,只有在 developer.chrome.com
host
該圖標是亮的,其餘 host 下是置灰的。
最後一步,咱們獲取從後臺腳本文件中設置到 storage
中的 color
變量,更換 popup
中 button
的顏色,而後點擊 button
,更換當前頁面的背景顏色。
咱們須要建立一個 popup.js
而且在 popup.html
中引入。就和正常的網頁開發同樣的使用姿式。
'use strict';
let changeColor = document.getElementById('changeColor');
chrome.storage.sync.get('color', function(data) {
changeColor.style.backgroundColor = data.color;
changeColor.setAttribute('value', data.color);
});
changeColor.onclick = function(element) {
let color = element.target.value;
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
console.log('color', color);
chrome.tabs.executeScript(
tabs[0].id,
{code: 'document.body.style.backgroundColor = "' + color + '";'});
});
};
複製代碼
咱們使用了 chrome
的 tabs api
,因此須要在 mainfest.json
中獲取 activeTab
的權限
至此,咱們已經完成了咱們第一個 chrome 擴展程序的開發。 在 developer.chrome.com/ 下,點擊右上角工具欄咱們建立的擴展程序,會有一個彈出框,其中只有一個綠色的按鈕,點擊按鈕,該網頁的背景顏色會變成綠色。