浏览器插件本质上就是利用前端的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"]
});
});
复制代码