源码:https://pan.baidu.com/s/1EUOUo6QwHezyddmslyFsJQ 提取码:xtex
目录
十五、设置背景图web_accessible_resources
2、在vscode内该文件夹中,创建manifest.json文件,进行插件信息的配置;
{
“manifest_version”:2,//版本号,由google指定为2
“name”: “helloWorld”,//插件名称
“version”:“1.0”,//插件版本
“description”:“hello world 插件”,//插件描述
“icons”:{//插件图标
“128”:“img/logo.png”,
“48”:“img/logo.png”,
“16”:“img/logo.png”
},
“browser_action”:{
“default_icon”:“img/logo.png”,//插件图标
“default_popup”:“popup.html”//点击图标后弹出的html互动文件
}
}
3、创建popup.html文件,进行点击图标后弹出窗口的配置;
4、将插件图标文件移入到插件根目录文件夹下;
**问题:**此处疑似需要使用原生的png图片,我用了jpg图片转png图片后,插件图标一直显示不出来,不太清楚是什么原因,后来换成原生的png图片就可以显示了。
3、在js包中,创建popup.js文件,写入JavaScript代码,实现插件的逻辑功能;
$(function(){
$(‘#input1’).keyup(function(){
KaTeX parse error: Expected 'EOF', got '#' at position 3: ('#̲message').text(…(‘#input1’).val())
})
})
4、进入popup.html文件,在标签内更改html代码,导入jquery.js及popup.js;
5、在Chrome上传插件,即可完成插件开发。
**目的:**为了在第3节中实现一个金额计数器的功能插件,需要使用到chrome的storage存储功能,该功能可以将插件中需要保存的数据写入到本地磁盘,从而帮助存储每次累加的金额,而不至于下一次打开插件,金额就归0需要重新计算。
1、首先在第2节的基础上,在manifest.json中加入下列语句,赋予chrome.storage的权限;
{
“manifest_version”:2,
“name”: “helloEverything”,
“version”:“1.0”,
“description”:“hello everything 插件”,
“icons”:{
“128”:“img/logo.png”,
“48”:“img/logo.png”,
“16”:“img/logo.png”
},
“browser_action”:{
“default_icon”:“img/logo.png”,
“default_popup”:“popup.html”
},
“permissions”:[
“storage”
]
}
2、在popup.html文件中,在标签内,写入以下html语句,实现金额计数器的UI界面;
3、在js文件夹内的popup.js文件内,写入JavaScript的逻辑代码,实现金额计数器的逻辑功能;
$(function(){
//在第一次运行时,如果总金额为0,也不会留空,而是有值显示
chrome.storage.sync.get(‘total’,function(budget){
$(‘#total’).text(budget.total);
});
$(‘#add’).click(function(){
//1、从浏览器获取存储的金额
chrome.storage.sync.get(‘total’,function(budget){
var totalAmount = 0;
if(budget.total){
totalAmount = parseFloat(budget.total);
}
//2、将本次金额加到总金额中
var amount = $(‘#amount’).val();
if(amount){
totalAmount += parseFloat(amount);
chrome.storage.sync.set({‘total’:totalAmount});
}
//3、更新显示ui
$(‘#total’).text(totalAmount);
$(‘#amount’).val(‘’);
})
})
})
4、在Chrome上传插件,即可完成插件开发,金额加入前后如下。
→
**目的:**为了给金额计数器插件,添加限制金额及总金额清除的功能,第4节引入了options_page功能配置插件参数.
1、首先进入到manifest.json中,添加下列语句赋予插件options_page的权限;
{
“manifest_version”:2,
“name”: “optionsPage”,
“version”:“1.0”,
“description”:“optionsPage 插件”,
“icons”:{
“128”:“img/logo.png”,
“48”:“img/logo.png”,
“16”:“img/logo.png”
},
“browser_action”:{
“default_icon”:“img/logo.png”,
“default_popup”:“popup.html”
},
“permissions”:[
“storage”
],
“options_page”:“options.html”
}
2、创建options.html,实现options页面的UI设计;
3、进入js文件夹,创建options.js文件,实现了options.html中按钮的互动逻辑;
$(function(){
chrome.storage.sync.get(‘limit’,function(budget){
$(‘#limit’).val(budget.limit);
})
$('#setLimit').click(function(){
var limit = $('#limit').val();
if(limit){
chrome.storage.sync.set({'limit':limit},function(){
close();
})
}
})
$('#resetTotal').click(function(){
chrome.storage.sync.set({'total':0});
})
})
4、更新popup.html,加入限制金额的UI;
5、更新popup.js,加入限制金额的初始化代码;
chrome.storage.sync.get([‘total’,‘limit’],function(budget){
$(‘#total’).text(budget.total);
$(‘#limit’).text(budget.limit);
});
6、将插件上传到Chrome,完成插件开发。
**目的:**为了让金额计数器在总金额超过限制金额及总金额清零的时候发送chrome通知,第5节引入notifications消息通知
1、首先在manifest.json中添加下列语句,为金额计数器添加消息通知权限;
“permissions”:[
“storage”,
“notifications”
],
2、修改popup.js及options.js,为其添加消息通知逻辑功能;
$(function(){
//在第一次运行时,如果总金额为0,也不会留空,而是有值显示
chrome.storage.sync.get([‘total’,‘limit’],function(budget){
$(‘#total’).text(budget.total);
$(‘#limit’).text(budget.limit);
});
$(‘#add’).click(function(){
//1、从浏览器获取存储的金额
chrome.storage.sync.get(‘total’,function(budget){
var totalAmount = 0;
if(budget.total){
totalAmount = parseFloat(budget.total);
}
//2、将本次金额加到总金额中
var amount = $(‘#amount’).val();
if(amount){
totalAmount += parseFloat(amount);
chrome.storage.sync.set({‘total’:totalAmount},function(){
if(totalAmount > parseFloat(budget.limit)){
var notifyOptions = {
type:‘basic’,
title:‘提示!’,
iconUrl:‘img/logo.png’,
message:‘您消费的总金额已经超出限制!’
}
chrome.notifications.create(‘limitNotify’,notifyOptions);
}
});
}
//3、更新显示ui
$(‘#total’).text(totalAmount);
$(‘#amount’).val(‘’);
})
})
})
$(function(){
chrome.storage.sync.get(‘limit’,function(budget){
$(‘#limit’).val(budget.limit);
})
$('#setLimit').click(function(){
var limit = $('#limit').val();
if(limit){
chrome.storage.sync.set({'limit':limit},function(){
close();
})
}
})
$('#resetTotal').click(function(){
chrome.storage.sync.set({'total':0},function(){
var notifyOptions = {
type:'basic',
title:'提示!',
iconUrl:'img/logo.png',
message:'您消费的总金额已经清0!'
}
chrome.notifications.create('limitNotify',notifyOptions);
});
})
})
3、将插件上传至Chrome,插件开发完成,消息通知结果如下。
**目的:**为了可以将被鼠标直接右键点击的数字加入到金额计数器中计算总金额,第6节引入了contextMenus功能。
1、首先进入manifest.json文件,在permission字条中添加contextMenus,并添加background字条关联event Page.js文件;
“background”:{
“scripts”:[“js/eventPage.js”],//关联的代码
“persistent”:false//是否在页面上一直运行
},
“permissions”:[
“storage”,
“notifications”,
“contextMenus”
],
2、在js文件夹内,添加eventPage.js文件,创建右击后的contextMenus并为其添加事件监听;
//1、创建contextMenus
var contextMenu = {
id:“addAmount”,
title:“添加消费”,
//contexts:page,video…
contexts:[“selection”]
}
chrome.contextMenus.create(contextMenu);
//2、为contextMenus添加事件监听
chrome.contextMenus.onClicked.addListener(function(clickData){
//clickData.menuItemId:被点击的菜单选项卡的id
//clickData.selectionText:选中的内容
if(clickData.menuItemId == ‘addAmount’ && clickData.selectionText){
var amount = parseFloat(clickData.selectionText);
//1、从浏览器获取存储的金额
chrome.storage.sync.get(‘total’,function(budget){
var totalAmount = 0;
if(budget.total){
totalAmount = parseFloat(budget.total);
}
//2、将本次金额加到总金额中
if(amount){
totalAmount += amount;
chrome.storage.sync.set({‘total’:totalAmount},function(){
if(totalAmount > parseFloat(budget.limit)){
var notifyOptions = {
type:‘basic’,
title:‘提示!’,
iconUrl:‘img/logo.png’,
message:‘您消费的总金额已经超出限制!’
}
chrome.notifications.create(‘limitNotify’,notifyOptions);
}
});
}
})
}
})
3、将插件上传至Chrome,则插件开发完成,对功能的演示如下。
→→
**目的:**为了实现将总金额直接显示在图标上,而不用每次都点开弹窗才能看得到总金额,第7节引入徽章badge功能。
1、直接进入eventPage界面,添加如下代码实现功能;
//设置Badge徽章
chrome.storage.onChanged.addListener(function(changes,storageName){
//changes.total.newValue:总金额变化后的值
chrome.browserAction.setBadgeText({“text”:changes.total.newValue.toString()});
chrome.browserAction.setBadgeBackgroundColor({“color”:[0,255,0,255]});
});
2、将插件上传,完成插件开发,功能效果如下。
**目的:**之前实现的browserAction插件,在任何界面上都可以使用,而为了实现仅针对特定页面的插件,第8节引入了pageAction功能。
1、首先创建新的manifest文件,需要注意的是,这里的新增了page_action词条,并且permission词条中加入了tabs权限;
{
“manifest_version”:2,
“name”: “pageAction”,
“version”:“1.0”,
“description”:“pageAction 插件”,
“icons”:{
“128”:“img/f.png”,
“48”:“img/f.png”,
“16”:“img/f.png”
},
“page_action”:{
“default_icon”:“img/f.png”,
“default_title”:“pageAction 插件”,
“default_popup”:“popup.html”
},
“background”:{
“scripts”:[“js/pageAction.js”],
“persistent”:false
},
“permissions”:[
“tabs”
]
}
2、创建popup.html,完成插件UI的编写;
3、创建pageAction.js文件,完成针对特定网页启动插件的功能逻辑代码;
//chrome.tabs.query:查询当前的窗口是否为淘宝,如果是,则将当前的窗口存入到tabs中
//chrome.pageAction.show:将插件在之前传入到tabs的窗口中进行展示
chrome.tabs.query({currentWindow:true,url:“https://www.taobao.com/”},function(tabs){
chrome.pageAction.show(tabs[0].id);
})
4、将插件上传到Chrome,完成插件的开发,对于特定页面的识别功能如下。
**目的:**在第8节中,我们先通过匹配页面的url,再确定当前插件是否可在页面上可用,然而我们在实际操作中一般不这么做,在实际操作中,我们一般向特定的页面进行注入代码,然后动态地进行识别。
1、首先在manifest.json中,加入"content_scripts"词条,匹配特定的页面,并向页面注入代码;同时在permission词条中,加入所需匹配的页面;
“permissions”:[
“tabs”,
“https://.baidu.com/"
],
“content_scripts”:[
{
“matches”:["https://.baidu.com/”],
“js”:[“js/jquery-3.3.1.min.js”,“js/content.js”]
}
]
2、创建content.js作为向页面内注入代码的JavaScript文件,此时被注入的页面会发送消息;
//消息发送出去
chrome.runtime.sendMessage({todo:“showPageAction”});
3、创建pageAction.js文件,用于接受由特定页面发送的消息,并判断当前打开的动态页面是否可以匹配上发送消息的页面,如果匹配成功,则让插件可以在该页面上使用;
//由content.js实现发送消息的逻辑后,通过pageAction实现接受消息的逻辑
chrome.runtime.onMessage.addListener(function(request,sender,response){
//通过匹配接受到消息的todo是否为showPageAction,从而确定当前接受的消息是否是目标消息,
//如果是,则使插件可以在当前页面使用
if(request.todo==“showPageAction”){
chrome.tabs.query({active:true,currentWindow:true},function(tabs){
chrome.pageAction.show(tabs[0].id);
});
}
});
4、将插件上传到Chrome,则插件开发完成,功能演示,如下,本章使用*.baidu.com作为特定页面,则插件仅可以在百度页面使用。
**目的:**目前可以重写的页面包括:新标签页、历史记录页面和书签页面,通过引入chrome_url_overrides可以将这三个页面重写为我们想要的样子。
1、创建manifest.json,添加chrome_url_overrides标签,指定需要重写的页面(新标签页:newtab,历史记录页面:history,书签页:bookmarks),需要注意的是,每个插件仅可以重写一个页面;
{
“manifest_version”:2,
“name”: “pageAction”,
“version”:“1.0”,
“description”:“pageAction 插件”,
“icons”:{
“128”:“img/f.png”,
“48”:“img/f.png”,
“16”:“img/f.png”
},
“chrome_url_overrides”:{
“newtab”:“new.html”
}
}
2、创建new.html,编写新页面的代码;
3、上传插件到chrome,完成开发,页面如下。
**目的:**为了实现在任何页面上,随机选定一个单词,都可以右键使用google翻译的功能。
1、创建manifest.json;
{
“manifest_version”:2,
“name”: “translation”,
“version”:“1.0”,
“description”:“谷歌翻译插件”,
“icons”:{
“128”:“img/f.png”,
“48”:“img/f.png”,
“16”:“img/f.png”
},
“background”:{
“scripts”:[“js/translate.js”],
“persistent”:false
},
“permissions”:[
“contextMenus”
]
}
2、创建translate.js文件;
var menuItem = {
“id”:“translate”,
“title”:“使用谷歌翻译”,
“contexts”:[“selection”]
}
chrome.contextMenus.create(menuItem);
chrome.contextMenus.onClicked.addListener(function(clickData){
//clickData.menuItemId:被点击的菜单选项卡的id
//clickData.selectionText:选中的内容
if(clickData.menuItemId == ‘translate’ && clickData.selectionText){
//配置createData的参数
var createData = {
url:“https://translate.google.cn/?sl=zh-CN&tl=en&text=”+clickData.selectionText+“&op=translate”,
type:“popup”,
top:5,
left:5,
width:screen.availWidth/2,
height:screen.availHeight/2
}
chrome.windows.create(createData);
}
})
3、上传插件到Chrome,完成插件开发,功能如下。
**目的:**为了实现在任何页面上,随机选定一个单词,都可以右键使用语音朗读的功能;
1、创建manifest.json,在permission标签中加入tts权限,启用google自带的语音朗读功能;
{
“manifest_version”:2,
“name”: “tts”,
“version”:“1.0”,
“description”:“语音朗读插件”,
“icons”:{
“128”:“img/f.png”,
“48”:“img/f.png”,
“16”:“img/f.png”
},
“background”:{
“scripts”:[“js/speak.js”],
“persistent”:false
},
“permissions”:[
“contextMenus”,
“tts”
]
}
2、创建speak.js文件;
var menuItem = {
“id”:“tts”,
“title”:“使用语音朗读”,
“contexts”:[“selection”]
}
chrome.contextMenus.create(menuItem);
chrome.contextMenus.onClicked.addListener(function(clickData){
//clickData.menuItemId:被点击的菜单选项卡的id
//clickData.selectionText:选中的内容
if(clickData.menuItemId == ‘tts’ && clickData.selectionText){
chrome.tts.speak(clickData.selectionText,{“rate”:0.7});
}
})
3、上传插件到Chrome,完成插件开发,功能如下。
**目的:**之前学习了在manifest.json文件中用content_scripts注入javascript或css文件到页面,这个方法有几个弊端:
1、文件直接写在了manifest中,灵活性较差;
2、即使只执行一行代码,也需要注入一个文件;
3、执行的时机不好掌握。
**需求:**当觉得网页字体较小的时候,右击页面,弹出菜单中点击增大字体,可以增大网页的字体字号。
1、首先创建manifest.json,在permission标签中,添加了tabs及
{
“manifest_version”:2,
“name”: “increase”,
“version”:“1.0”,
“description”:“增大字体插件”,
“icons”:{
“128”:“img/f.png”,
“48”:“img/f.png”,
“16”:“img/f.png”
},
“background”:{
“scripts”:[“js/increase.js”],
“persistent”:false
},
“permissions”:[
“contextMenus”,
“tabs”,
“
]
}
2、创建increase.js文件;
var menuItem = {
“id”:“increase”,
“title”:“增大字体”,
“contexts”:[“all”]
}
chrome.contextMenus.create(menuItem);
chrome.contextMenus.onClicked.addListener(function(clickData){
chrome.tabs.executeScript(null,{code:“var old = window.getComputedStyle(document.body).fontSize;
var index = old.indexOf(‘p’);
var size = parseInt(old.substring(0,index));
var newSize = size + 10+‘px’;
document.body.style.fontSize = newSize;”});
})
3、将插件上传到Chrome,插件开发完成,放大字体功能前后对比如下。
**目的:**将页面的背景图设置成为其他图片
1、创建manifest.json文件,添加了web_accessible_resources标签;
{
“manifest_version”:2,
“name”: “resources”,
“version”:“1.0”,
“description”:“设置背景图”,
“icons”:{
“128”:“img/f.png”,
“48”:“img/f.png”,
“16”:“img/f.png”
},
“background”:{
“scripts”:[“js/increase.js”],
“persistent”:false
},
“permissions”:[
“contextMenus”,
“tabs”,
“
],
“web_accessible_resources”:[
“img/*”
]
}
2、创建resources.js文件;
var menuItem = {
“id”:“resources”,
“title”:“设置背景图”,
“contexts”:[“all”]
}
chrome.contextMenus.create(menuItem);
chrome.contextMenus.onClicked.addListener(function(clickData){
var imgurl = chrome.extension.getURL(“img/背景.png”);
chrome.tabs.executeScript(null,{code:“document.body.style.backgroundImage = 'url(”“+imgurl+”“)';
document.body.style.backgroundRepeat = ‘repeat’;”});
})
3、上传插件到Chrome,插件开发完成,功能演示如下。
**目的:**将搜索结果块的背景设置成绿色
1、创建manifest.json文件;
{
“manifest_version”:2,
“name”: “backcolor”,
“version”:“1.0”,
“description”:“设置背景块颜色”,
“icons”:{
“128”:“img/f.png”,
“48”:“img/f.png”,
“16”:“img/f.png”
},
“background”:{
“scripts”:[“js/backcolor.js”],
“persistent”:false
},
“permissions”:[
“contextMenus”,
“tabs”,
“
],
“web_accessible_resources”:[
“img/*”
]
}
2、创建backcolor.js文件;
var menuItem = {
“id”:“backcolor”,
“title”:“设置背景颜色”,
“contexts”:[“all”]
}
chrome.contextMenus.create(menuItem);
chrome.contextMenus.onClicked.addListener(function(clickData){
var imgurl = chrome.extension.getURL(“img/背景.png”);
chrome.tabs.insertCSS(null,{file:“backcolor.css”});
})
3、进入chrome开发者模式,观看网络源码,确定需要修改css代码的部分;
4、根据第3步确定需要更改css代码的部分,创建backcolor.css文件;
.c-container{
background-color: green;
}
5、上传插件到Chrome,完成插件开发。背景搜索块颜色更改功能如下。
长连接消息,我们使用connect,消息发送后,会等待消息的回复,使对话一直持续下去。
**目的:**在content.js文件和background.js文件之间进行一次长消息对话。
1、在第9节content_script的基础上,创建content.js;
//创建一个长连接port,用于首先发送消息
var port = chrome.extension.connect({name:“knock”});
port.postMessage({question:“你好,有人吗”});
//console.log可以在控制台看到消息
console.log(“content_send:你好,有人吗”);
port.onMessage.addListener(function(msg){
if(msg.answer == “你好,我是”){
console.log(“content_get”+msg.answer);
port.postMessage({question:“哪个”});
console.log(“content_send:哪个”);
}else if(msg.answer == “写代码的”){
console.log(“content_get”+msg.answer);
port.postMessage({question:“有你的快递”});
console.log(“content_send:有你的快递”);
}
});
2、创建background.js文件;
chrome.extension.onConnect.addListener(function(port){
port.onMessage.addListener(function(msg){
if(msg.question == “你好,有人吗”){
port.postMessage({answer:“你好,我是”});
}else if(msg.question == “哪个”){
port.postMessage({answer:“写代码的”})
}
})
})
3、将插件上传到Chrome,完成插件开发,控制台界面如下。
2、创建manifest.json文件;
{
“manifest_version”:2,
“name”: “bdtraslate”,
“version”:“1.0”,
“description”:“百度翻译插件”,
“icons”:{
“128”:“img/f.png”,
“48”:“img/f.png”,
“16”:“img/f.png”
},
“background”:{
“scripts”:[“js/md5.js”,“js/jquery-3.3.1.min.js”,“js/translate.js”],
“persistent”:true
},
“permissions”:[
“contextMenus”,
“tabs”,用于输出
“http://api.fanyi.baidu.com/”,将api的网址加入权限
],
“content_scripts”:[
{
“matches”:[“
“js”:[“js/content.js”]
}
]
}
3、创建translate.js文件,完成右键菜单设计、选中中文的翻译及信息发送功能;
var menuItem = {
“id”: “bdtranslate”,
“title”: “百度翻译”,
“contexts”: [“selection”]
}
chrome.contextMenus.create(menuItem);
chrome.contextMenus.onClicked.addListener(function (clickData) {
if (clickData.menuItemId == ‘bdtranslate’ && clickData.selectionText) {
//以下内容,从百度翻译API的index.html中复制粘贴
//需要将其中的appid,key,query修改为自己的id,key和查询内容
var appid = ‘20220327001144201’;//自己的APPID,官网可查
var key = ‘E_NCDdjbBUP8gqzFPdYJ’;//自己的KEY,官网可查
var salt = (new Date).getTime();
var query = clickData.selectionText;//右键选中的内容
// 多个query可以用
连接 如 query=‘apple
orange
banana
pear’
var from = ‘zh’;//中文
var to = ‘en’;//英文
var str1 = appid + query + salt + key;
var sign = MD5(str1);
//由于插件内的js内容不允许使用ajax,以下内容为从index.html中的ajax部分复制并修改得到
var url = ‘http://api.fanyi.baidu.com/api/trans/vip/translate’;
url += “?q=”+query;
url += “&appid=”+appid;
url += “&salt=”+salt;
url += “&from=”+from;
url += “&to=”+to;
url += “&sign=”+sign;
//使用fetch获取的json结果需要先转换为string再转换为json
fetch(url)
.then(reponse => reponse.text())
.then(text =>JSON.parse(text))
.then(translateRsult => {
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
//result通过查询浏览器的开发者模式得知
chrome.tabs.sendMessage(tabs[0].id, { todo: “translate”, result: translateRsult.trans_result[0].dst })
})
})
}
})
其中,index.html需要复制的内容如下:
var appid = '20220327001144201';
var key = 'E_NCDdjbBUP8gqzFPdYJ';
var salt = (new Date).getTime();
var query = 'apple';
// 多个query可以用
连接 如 query='apple
orange
banana
pear'
var from = 'en';
var to = 'zh';
var str1 = appid + query + salt +key;
var sign = MD5(str1);
$.ajax({
url: 'http://api.fanyi.baidu.com/api/trans/vip/translate',
type: 'get',
dataType: 'jsonp',
data: {
q: query,
appid: appid,
salt: salt,
from: from,
to: to,
sign: sign
},
success: function (data) {
console.log(data);
}
});
chrome.tabs.sendMessage中的输出result可以根据index.html在浏览器开发者模式中的输出得知,如下所示;
4、创建content.js,用于监听translate发送的信息并使用alert将翻译结果弹出;
chrome.runtime.onMessage.addListener(function(request,sender,response){
if(request.todo==“translate”){
alert(request.result);
}
})
5、将index.html及md5.js加入插件文件夹;
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦