瀏覽器插件本質上就是利用前端的html\css\javascript等技術,借用瀏覽器對外提供的API,實現各類不一樣的功能javascript
首先先看一下咱們要開發的插件的各個文件組成css
manifest.json :咱們在項目的根文件必需要有一個命名爲manifest.json的文件,它是整個插件的功能入口,用來告訴瀏覽器插件的一些基本信息,及須要加載和執行的資源文件等,裏面包含一些必填項:html
{
"name": "hello extension",
"description": "Base Level Extension",
"version": "1.0",
"manifest_version": 2,
}
複製代碼
{
"icons": {
"16": "images/extension_icon16.png",
"32": "images/extension_icon32.png",
"48": "images/extension_icon48.png",
"128": "images/extension_icon128.png"
},
}
複製代碼
// scripts 子選項指定了須要執行的js文件的路徑及文件名
{
"background": {
"scripts":["background.js"],
"persistent": false
}
}
複製代碼
background.js 一般最外層使用監聽事件chrome.runtime.onInstalled.addListener(()=>{})
初始化插件,監聽插件安裝成功後,會觸發對應的邏輯開始工做前端
{
"permissions": [
"http://xxx.com/api"
"tabs",
"activeTab",
"notifications",
"declarativeContent",
"storage"
],
}
複製代碼
{
"browser_action": {
"default_popup": "popup.html" // 指定click插件圖標時,展現的頁面
"default_icon": "images/icon.png", // 指定瀏覽器工具欄展現的插件的圖標
"default_title": "display tooltip" // 當鼠標懸浮在插件圖片上方時,展現的文字,叫tooltip;若是沒有這個配置選項,則懸浮時顯示menifest.json中的name選項值
}
}
複製代碼
background script
裏,chrome.runtime.onInstalled.addListener(()=>{})
初始化中使用chrome.declarativeContent
定義插件被激活的規則{
"page_action":{
"default_popup": "popup.html", // 指定click插件圖標時,展現的頁面
"default_icon": "hello_extension.png" // 指定瀏覽器工具欄展現的插件的圖標
"default_title": "display tooltip"
},
}
複製代碼
chrome.runtime.onInstalled.addListener(function() {
// Replace all rules ...
chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
// With a new rule ...
chrome.declarativeContent.onPageChanged.addRules([
{
// That fires when a page's URL contains a 'g' ...
conditions: [
new chrome.declarativeContent.PageStateMatcher({
pageUrl: { urlContains: 'g' }, //url的內容中包含字母g的,插件纔會被激活
})
],
// And shows the extension's page action.
actions: [ new chrome.declarativeContent.ShowPageAction() ]
}
]);
});
});
複製代碼
popup.html 是使用browser_action或者page_action 指定的default_popup選項,表示點擊插件圖標會觸發的html資源,其與普通的html頁面的區別就是不能使用內聯script,其餘都同樣 it can contain links to stylesheets and script tags, but does not allow inline JavaScript.java
chrome.tabs.sendMessage()
發佈一個請求信息,傳遞出去當前的tab頁id及其餘信息chrome.tabs.sendMessage()
,從Content Script發佈簡單的信息到Page action 或Browser action 可使用chrome.runtime.sendMessage()
chrome.tabs.sendMessage(
tabs[0].id, //當前激活的tab頁id
{greeting: "hello"}, //須要傳遞的信息
function(response) { //用來接收反饋的回調函數
console.log(response.farewell);
});
複製代碼
chrome.runtime.onMessage().addListener()
監聽事件,等待另外一側請求信息的發佈chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting == "hello")
sendResponse({farewell: "goodbye"});
});
複製代碼
chrome.tabs.sendMessage()
最後一個參數是一個回調函數,用來接收另外一側反饋回來的數據,最後同步到UI上chrome.tabs.sendMessage()
複製代碼
Content script有兩種注入方式:編程式動態注入、聲明式注入jquery
編程式動態注入:獲取activeTab
權限後,使用chrome.tabs.executeScript()
來注入js代碼片斷,使用chrome.tabs.insertCSS()
注入css代碼片斷web
//manifest.json
{
"name": "My extension",
...
"permissions": [
"activeTab"
],
}
複製代碼
在Page action 或Browser action 中的js中實行編程式動態注入content script,其訪問和更改的就是web page上的DOM屬性
```js
chrome.runtime.onMessage.addListener(
function(message, callback) {
if (message == 「changeColor」){
chrome.tabs.executeScript({
code: 'document.body.style.backgroundColor="orange"'
});
}
});
// 你也能夠注入一個文件
chrome.runtime.onMessage.addListener(
function(message, callback) {
if (message == 「runContentScript」){
chrome.tabs.executeScript({
file: 'contentScript.js'
});
}
});
複製代碼
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["http://*.nytimes.com/*"],
"css": ["myStyles.css"],
"js": ["contentScript.js"]
}
],
...
}
複製代碼
{
"content_scripts" : [{
"matches" : ["*://*/*"],
"js" : ["content.js", "jquery.js"],
"css" : ["style.css"],
"run_at" : "document_end"
}],
}
複製代碼
options_page 設置插件的選項頁面,配置了此選項後,在插件上鼠標右鍵時,會有一個‘選項’按鈕,點擊後會進入options_page對應的頁面chrome
{
"options_page":"options.html"
}
複製代碼
chrome_url_overrides 設置可替換的chrome默認頁面編程
{
"chrome_url_overrides":{
"newtab": "newTab.html"
}
}
複製代碼
chrome.tabs.create(object createProperties, function callback) 建立新的標籤。注: 無需請求manifest的標籤權限,此方法也能夠被使用。 Parameters createProperties ( object )json
Callback function 回調 參數 應該以下定義:
function(Tab tab) {...}; tab ( Tab ) 所建立的標籤的細節,包含新標籤的ID。
chrome.tabs.executeScript(integer tabId, object details, function callback) 向頁面注入JavaScript 腳本執行 Parameters
chrome.tabs.query(object queryInfo, function callback) 獲取通過特定過濾條件篩選的標籤頁信息,若是沒有特定過濾條件則是獲取全部標籤頁信息
queryInfo 爲特定的屬性,用來對標籤頁進行過濾。 經常使用的屬性有:(全部屬性均爲boolean值)
chrome.tabs.query({
active:true,
currentWindow:true
},function(tabs){
//...
})
複製代碼
callback 是獲取到特定標籤頁信息後的回調函數,參數爲標籤的信息
{"permissions": ["contextMenus", "storage"]}
chrome.contextMenus.create({})
建立內容目錄chrome.runtime.onInstalled.addListener(function() {
//...
chrome.contextMenus.create({
"id": "sampleContextMenu",
"title": "Sample Context Menu",
"contexts": ["selection"]
});
});
複製代碼