日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

vue+element開發(fā)一個谷歌插件的全過程

瀏覽:72日期:2022-09-30 08:59:26

簡單功能:點擊瀏覽器右上角插件icon彈出小彈窗,點擊設置彈出設置頁,并替換背景圖或顏色。

開始

1.本地創(chuàng)建文件夾testPlugin并新建manifest.json文件

{ 'name': 'testPlugin', 'description': '這是一個測試用例', 'version': '0.0.1', 'manifest_version': 2}

2.添加插件的小icon

testPlugin下創(chuàng)建icons文件夾,可以放入一些不同尺寸的icon,測試可以偷懶都放一種尺寸的icon。修改manifest.json為:

{ 'name': 'testPlugin', 'description': '這是一個測試用例', 'version': '0.0.1', 'manifest_version': 2, 'icons': { '16': 'icons/16.png', '48': 'icons/16.png' }}

這時候在擴展程序中加載已解壓的程序(就是我們創(chuàng)建的文件夾),就可以看到雛形了:

vue+element開發(fā)一個谷歌插件的全過程

3.選擇性地添加點擊插件icon瀏覽器右上角彈出來的框

'browser_action': { 'default_title': 'test plugin', 'default_icon': 'icons/16.png', 'default_popup': 'index.html'}

testPlugin創(chuàng)建index.html文件:

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>test plugin</title></head><body> <input placeholder='請輸入'/></body></html>

刷新插件,這時候點擊瀏覽器中剛剛添加的插件的icon,就會彈出:

vue+element開發(fā)一個谷歌插件的全過程

4.js事件(樣式同理)

document.getElementById(’button’).onclick = function() { alert(document.getElementById(’name’).value)}

html中:

<input placeholder='請輸入'/><input type='button' value='點擊'/><script src='http://www.b3g6.com/bcjs/js/index.js'></script>

刷新插件,這時候點擊瀏覽器中剛剛添加的插件的icon,就會彈出輸入框中的值:

vue+element開發(fā)一個谷歌插件的全過程

一個嵌入網(wǎng)頁中的懸浮框

上述例子是點擊icon瀏覽器右上角出現(xiàn)的小彈窗,

引入vue.js、element-ui

下載合適版本的vue.js和element-ui等插件,同樣按照index.js一樣的操作引入,如果沒有下載單獨js文件的地址,可以打開cdn地址直接將壓縮后的代碼復制。

manifest.json中添加:

'content_scripts': [ { 'matches': ['<all_urls>' ], 'css': ['css/index.css' ], 'js': ['js/vue.js','js/element.js','js/index.js' ], 'run_at': 'document_idle' } ],

在index.js文件:

這里使用在head里插入link 的方式引入element-ui的css,減少插件包的一點大小,當然也可以像引入index.js那樣在manifest.json中引入。

直接在index.js文件中寫Vue實例,不過首先得創(chuàng)建掛載實例的節(jié)點:

let element = document.createElement(’div’)let attr = document.createAttribute(’id’)attr.value = ’appPlugin’element.setAttributeNode(attr)document.getElementsByTagName(’body’)[0].appendChild(element)let link = document.createElement(’link’)let linkAttr = document.createAttribute(’rel’)linkAttr.value = ’stylesheet’let linkHref = document.createAttribute(’href’)linkHref.value = ’https://unpkg.com/element-ui/lib/theme-chalk/index.css’link.setAttributeNode(linkAttr)link.setAttributeNode(linkHref)document.getElementsByTagName(’head’)[0].appendChild(link)const vue = new Vue({ el: ’#appPlugin’, template:` <div class='app-plugin-content'>{{text}}{{icon_post_message}}<el-button @click='Button'>Button</el-button></div> `, data: function () {return { text: ’hhhhhh’, icon_post_message: ’_icon_post_message’, isOcContentPopShow: true } }, mounted() {console.log(this.text) }, methods: {Button() { this.isOcContentPopShow = false} }})讓我們來寫一個簡易替換網(wǎng)頁背景顏色工具

index.js:

let element = document.createElement(’div’)let attr = document.createAttribute(’id’)attr.value = ’appPlugin’element.setAttributeNode(attr)document.getElementsByTagName(’body’)[0].appendChild(element)let link = document.createElement(’link’)let linkAttr = document.createAttribute(’rel’)linkAttr.value = ’stylesheet’let linkHref = document.createAttribute(’href’)linkHref.value = ’https://unpkg.com/element-ui/lib/theme-chalk/index.css’link.setAttributeNode(linkAttr)link.setAttributeNode(linkHref)document.getElementsByTagName(’head’)[0].appendChild(link)const vue = new Vue({ el: ’#appPlugin’, template: `<div v-if='isOcContentPopShow' id='oc_content_page'> <div id='oc_content_title'>顏色 <el-button type='text' icon='el-icon-close' @click='close'></el-button></div> <div class='app-plugin-content'>背景:<el-color-picker v-model='color1'></el-color-picker></div> <div class='app-plugin-content'>字體:<el-color-picker v-model='color2'></el-color-picker></div></div> `, data: function () {return { color1: null, color2: null, documentArr: [], textArr: [], isOcContentPopShow: true } }, watch: {color1(val) { let out = document.getElementById(’oc_content_page’) let outC = document.getElementsByClassName(’el-color-picker__panel’) this.documentArr.forEach(item => { if(!out.contains(item) && !outC[0].contains(item) && !outC[1].contains(item)) {item.style.cssText = `background-color: ${val}!important;color: ${this.color2}!important;` } })},color2(val) { let out = document.getElementById(’oc_content_page’) let outC = document.getElementsByClassName(’el-color-picker__panel’)[1] this.textArr.forEach(item => {if(!out.contains(item) && !outC.contains(item)) {item.style.cssText = `color: ${val}!important;` } })} }, mounted() {chrome.runtime.onConnect.addListener((res) => { if (res.name === ’testPlugin’) {res.onMessage.addListener(mess => { this.isOcContentPopShow = mess.isShow}) }})this.$nextTick(() => { let bodys = [...document.getElementsByTagName(’body’)] let headers = [...document.getElementsByTagName(’header’)] let divs = [...document.getElementsByTagName(’div’)] let lis = [...document.getElementsByTagName(’li’)] let articles = [...document.getElementsByTagName(’article’)] let asides = [...document.getElementsByTagName(’aside’)] let footers = [...document.getElementsByTagName(’footer’)] let navs = [...document.getElementsByTagName(’nav’)] this.documentArr = bodys.concat(headers, divs, lis, articles, asides, footers, navs) let as = [...document.getElementsByTagName(’a’)] let ps = [...document.getElementsByTagName(’p’)] this.textArr = as.concat(ps)}) }, methods: {close() { this.isOcContentPopShow = false} }})

index.html:

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>my plugin</title> <link rel='stylesheet' href='http://www.b3g6.com/bcjs/css/index.css'></head><body> <div class='plugin'> <input type='button' value='打開' /> </div></body><script src='http://www.b3g6.com/bcjs/js/icon.js'></script></html>

新建icon.js:

plugin_button.onclick = function () { mess()}async function mess () { const tabId = await getCurrentTabId() const connect = chrome.tabs.connect(tabId, {name: ’testPlugin’}); connect.postMessage({isShow: true})}function getCurrentTabId() { return new Promise((resolve, reject) => { chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) { resolve(tabs.length ? tabs[0].id : null) }); })}

這樣一個小嘗試就完成了,當然如果有更多需求可以結(jié)合本地存儲或者服務端來協(xié)作。

總結(jié)

到此這篇關(guān)于vue+element開發(fā)一個谷歌插件的文章就介紹到這了,更多相關(guān)vue+element開發(fā)插件內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
激情久久中文字幕| 日本蜜桃在线观看视频| 美女视频黄 久久| 免费一级欧美片在线观看网站| 视频在线观看91| 欧美亚洲色图校园春色| 欧美精品中文字幕亚洲专区| 午夜一级久久| 日韩一区精品| 日本综合精品一区| 蜜臀a∨国产成人精品| 蜜臀va亚洲va欧美va天堂| 麻豆视频在线看| 日韩电影免费网址| 久久久夜精品| 亚洲作爱视频| 日韩1区2区3区| 久久av超碰| 午夜久久中文| 免费毛片在线不卡| 亚洲v天堂v手机在线| 欧美三级第一页| 国产精品久久久久久久久妇女| 午夜影院一区| 蜜桃久久久久久| 青青草国产成人99久久| 久久精品系列| 成人午夜国产| 欧美日韩国产欧| 视频一区中文字幕精品 | 丝袜亚洲精品中文字幕一区| 日韩精品一级| 亚洲成人不卡| 一区二区精品| 中文字幕在线视频久| 蜜臀久久99精品久久久画质超高清 | 一区二区国产精品| 一区二区三区四区精品视频| 欧美激情五月| 香蕉久久久久久久av网站| 国产精品香蕉| 久久xxxx| 成人日韩精品| 国产精品一区二区三区av| 久久久久一区| 久久亚洲精品中文字幕| 亚洲欧洲另类| 99视频精品全国免费| 91精品国产自产精品男人的天堂 | 麻豆视频一区| 伊人精品视频| 国产高清精品二区| 亚洲激情二区| 日韩国产欧美在线视频| 国产一在线精品一区在线观看| 麻豆国产欧美日韩综合精品二区| 99在线|亚洲一区二区| 国产精品久久久久久久久久10秀| 日韩精品一页| 老牛影视精品| 久久精品一区| 国产精品一卡| 亚洲bt欧美bt精品777| 日韩欧美午夜| 国产一区二区久久久久| 日韩动漫一区| 日韩三级视频| 91亚洲无吗| 久久激情综合网| 日韩成人午夜精品| 国产日韩一区二区三区在线播放| 日韩视频在线一区二区三区 | 视频一区欧美日韩| 97精品国产福利一区二区三区| 欧美久久一区二区三区| 亚洲精品韩国| 99国产精品| 激情丁香综合| 在线亚洲精品| 日韩精品一卡二卡三卡四卡无卡| 在线一区电影| 日韩av中文在线观看| 国产精品最新| 日韩国产在线观看一区| 国产日本亚洲| 国产99在线| 欧美91视频| 香蕉久久一区| 久久亚洲道色| 免费成人网www| 91精品在线免费视频| 日本国产欧美| 中文字幕在线高清| 亚洲啊v在线免费视频| 卡一卡二国产精品| 91精品国产成人观看| 欧洲毛片在线视频免费观看| 国产高清一区| 亚洲有吗中文字幕| 亚洲欧美成人综合| 欧美精品中文字幕亚洲专区| 国产欧美在线| 精品国产中文字幕第一页| 欧美一区久久久| 精品捆绑调教一区二区三区| 欧美va天堂在线| 午夜精品网站| 国产成人免费| 国产农村妇女精品一二区| 日韩av网站免费在线| 成人一二三区| 欧美午夜不卡影院在线观看完整版免费| 日日摸夜夜添夜夜添国产精品| 久久精品欧洲| 视频一区免费在线观看| 欧美一级鲁丝片| 日韩不卡手机在线v区| 久久中文字幕av一区二区不卡| 久久精品99国产精品日本| 亚洲精品小说| 性欧美videohd高精| 日本一区二区三区中文字幕| 免费精品国产的网站免费观看| 精品国产亚洲一区二区三区大结局| 亚洲tv在线| 中文字幕一区二区三区日韩精品 | 99日韩精品| 久久三级福利| 精品三级在线观看视频| 亚欧成人精品| 激情综合网址| 精品免费在线| 国产成人精品一区二区三区在线| 日韩av黄色在线| 日韩综合小视频| 综合一区在线| 日韩三级精品| 欧美啪啪一区| 一区二区电影| 香蕉久久夜色精品国产| 午夜一级久久| 91高清一区| 麻豆成全视频免费观看在线看| 国产精品白丝久久av网站| 亚洲精品91| 鲁鲁在线中文| 国产精品一区二区三区四区在线观看| 欧美特黄一区| 日韩综合一区二区三区| 国产美女亚洲精品7777| 亚洲免费毛片| 国产不卡精品| 久久影院午夜精品| 欧美69视频| 99亚洲视频| 亚洲电影在线一区二区三区| 美女久久一区| 麻豆国产91在线播放| 1000部精品久久久久久久久| 中文一区一区三区免费在线观| 国产麻豆精品| 国产精品v一区二区三区| 国产中文字幕一区二区三区| 免费日韩成人| 中文另类视频| 日本aⅴ精品一区二区三区| 久久精品国产一区二区| 亚洲女同中文字幕| 91午夜精品| 欧美jjzz| 国产精品羞羞答答在线观看| 欧美国产日韩电影| 不卡在线一区二区| 99视频一区| 日韩电影免费网址| 国产亚洲综合精品| 亚洲毛片在线| 久久中文视频| 美女性感视频久久| 日本欧美在线看| 日韩亚洲精品在线观看| 在线中文字幕播放| 精品三级av在线导航| 蜜桃久久精品一区二区| 成人精品国产亚洲| 日本精品一区二区三区在线观看视频| 青青久久av| 电影亚洲精品噜噜在线观看| 激情欧美一区二区三区| 日本不卡的三区四区五区| 蜜臀国产一区| 欧美亚洲一级| 日韩精品第二页| 中文字幕一区二区三区在线视频| 激情综合亚洲| 亚洲天堂久久| 99热国内精品| 蜜桃视频欧美| 午夜在线一区二区| 快she精品国产999|