欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年05月11日 10:35:37   作者:hello,是翠花呀  
這篇文章主要給大家介紹了關(guān)于vue+element開發(fā)一個(gè)谷歌插件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

簡(jiǎn)單功能:點(diǎn)擊瀏覽器右上角插件icon彈出小彈窗,點(diǎn)擊設(shè)置彈出設(shè)置頁(yè),并替換背景圖或顏色。

開始

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

{
    "name": "testPlugin",
    "description": "這是一個(gè)測(cè)試用例",
    "version": "0.0.1",
    "manifest_version": 2
}

2.添加插件的小icon

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

{
    "name": "testPlugin",
    "description": "這是一個(gè)測(cè)試用例",
    "version": "0.0.1",
    "manifest_version": 2,
    "icons": {
      "16": "icons/16.png",
      "48": "icons/16.png"
  }
}

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

3.選擇性地添加點(diǎn)擊插件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 id="name" placeholder="請(qǐng)輸入"/>
</body>
</html>

刷新插件,這時(shí)候點(diǎn)擊瀏覽器中剛剛添加的插件的icon,就會(huì)彈出:

4.js事件(樣式同理)

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

html中:

<input id="name" placeholder="請(qǐng)輸入"/>
<input id="button" type="button" value="點(diǎn)擊"/>
<script src="js/index.js"></script>

刷新插件,這時(shí)候點(diǎn)擊瀏覽器中剛剛添加的插件的icon,就會(huì)彈出輸入框中的值:

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

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

引入vue.js、element-ui

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

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,減少插件包的一點(diǎn)大小,當(dāng)然也可以像引入index.js那樣在manifest.json中引入。

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

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
        }
    }
})

讓我們來寫一個(gè)簡(jiǎn)易替換網(wǎng)頁(yè)背景顏色工具

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" class="oc-move-page" id="oc_content_page">
            <div class="oc-content-title" 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="css/index.css">
</head>

<body>
  <div class="plugin">
    <input id="plugin_button" type="button" value="打開" />
  </div>
</body>
<script src="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)
      });
  })
}

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

總結(jié)

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

相關(guān)文章

  • vue接口請(qǐng)求加密實(shí)例

    vue接口請(qǐng)求加密實(shí)例

    這篇文章主要介紹了vue接口請(qǐng)求加密實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue實(shí)現(xiàn)輸入一位數(shù)字轉(zhuǎn)漢字功能

    vue實(shí)現(xiàn)輸入一位數(shù)字轉(zhuǎn)漢字功能

    這篇文章主要介紹了vue實(shí)現(xiàn)輸入一位數(shù)字轉(zhuǎn)漢字功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 將vue項(xiàng)目打包成電腦端應(yīng)用.exe的完整步驟

    將vue項(xiàng)目打包成電腦端應(yīng)用.exe的完整步驟

    最近接了個(gè)小活,其中甲方要求把vue項(xiàng)目打包成exe安裝在windows上,其中有也會(huì)出現(xiàn)一些小問題和優(yōu)化,特此記錄,這篇文章主要給大家介紹了關(guān)于將vue項(xiàng)目打包成電腦端應(yīng)用.exe的完整步驟,需要的朋友可以參考下
    2023-10-10
  • Vue實(shí)現(xiàn)按鈕級(jí)權(quán)限方案

    Vue實(shí)現(xiàn)按鈕級(jí)權(quán)限方案

    這篇文章主要介紹了Vue按鈕級(jí)權(quán)限方案,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • vue結(jié)合leaflet實(shí)現(xiàn)鷹眼圖

    vue結(jié)合leaflet實(shí)現(xiàn)鷹眼圖

    本文主要介紹了vue結(jié)合leaflet實(shí)現(xiàn)鷹眼圖,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 詳解Vue.js 作用域、slot用法(單個(gè)slot、具名slot)

    詳解Vue.js 作用域、slot用法(單個(gè)slot、具名slot)

    這篇文章主要介紹了Vue.js 作用域、slot用法(單個(gè)slot、具名slot),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 詳解vue組件之間的通信

    詳解vue組件之間的通信

    這篇文章主要介紹了vue組件之間的通信,幫助大家更好的理解和學(xué)習(xí)前端的相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-08-08
  • vue中this.$refs.name.offsetHeight獲取不到值問題

    vue中this.$refs.name.offsetHeight獲取不到值問題

    這篇文章主要介紹了vue中this.$refs.name.offsetHeight獲取不到值問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue3使用src動(dòng)態(tài)引入本地圖片的詳細(xì)步驟

    Vue3使用src動(dòng)態(tài)引入本地圖片的詳細(xì)步驟

    這篇文章主要給大家介紹了關(guān)于Vue3使用src動(dòng)態(tài)引入本地圖片的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-12-12
  • vue獲取當(dāng)前激活路由的方法

    vue獲取當(dāng)前激活路由的方法

    下面小編就為大家分享一篇vue獲取當(dāng)前激活路由的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評(píng)論