[JavaScript]開發Chrome擴充功能

前言

Chrome瀏覽器商店內有非常多好用的擴充功能可以安裝

那麼有沒有想過自己也嘗試開發自己的擴充功能呢??

今天這篇文章將簡單敘述如何開發Chrome的擴充功能(一鍵開啟多數網址)

Step 1

在喜歡的地方建立一個資料夾當作根目錄,名稱隨意

進入根目錄後建立兩個資料夾,images 及 js

images資料夾內建立兩張圖片,icon.png (尺寸為64px * 64px) 及 icon_big.png (尺寸為128px * 128px)

作為擴充功能顯示的圖示

js資料夾內建立 run.js 檔案

根目錄下建立兩個檔案,index.html 及 manifest.json

01

manifest.json 請貼上以下內容

{
    "manifest_version": 2,
    "icons": {
        "128": "images/icon_big.png"
    },
    "description": "open multiple url", // 擴充功能簡介
    "browser_action": {
        "default_icon": "images/icon.png",
        "default_popup": "index.html", // 預設HTML檔案
        "default_title": ""
    },
    "name": "OMU", // 擴充功能名稱
    "version": "1.0.0", // 版本號
    "homepage_url": "https://www.google.com/", // 開發人員網站
    "permissions": [] // 需要的權限,可視情況加入
}

index.html 請貼上以下內容

<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="js/run.js"></script>
        <style type="text/css">
            html, body {
                margin: 0px;
                padding: 5px;
                width: 400px; 
                height: 550px;
                text-align: center;
            }

            textarea {
                width: 390px; 
                height: 500px;
                margin-left: -5px;
            }

            button {
                float: right;
                margin-right: 5px; 
                color: #fff;
                background-color: #007bff;
                border-color: #007bff;
                display: inline-block;
                font-weight: 400;
                text-align: center;
                white-space: nowrap;
                vertical-align: middle;
                -webkit-user-select: none;
                -moz-user-select: none;
                -ms-user-select: none;
                user-select: none;
                border: 1px solid transparent;
                padding: 0.375rem 0.75rem;
                font-size: 1rem;
                line-height: 1.5;
                border-radius: 0.25rem;
                transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
            }
        </style>
    </head>
    <body>
        <textarea id="urls" placeholder="One URL per line"></textarea>
        <br />
        <div>
            <button id="event">Open</button>
        </div>
    </body>
</html>

run.js 請貼上以下內容

function onWindowLoad() {
    let urls = document.getElementById('urls');

    document.getElementById('event').onclick = function() {
        urls.value.split(/\r\n|[\r\n]/).forEach(function(value) {
            value = value.replace(/\s+/, '');

            if (value != '') {
                chrome.tabs.create({ url: value });
            }
        });
    };
}

window.onload = onWindowLoad;

Step 2

開啟擴充功能頁面,或在網址輸入 chrome://extensions/

右上角的 開發人員模式 開關打開

點選 載入未封裝項目 選擇第一步建立的根目錄後就可以開始使用了

02

程式碼

index.html 會直接當作擴充功能的畫面

裡面先是載入了 run.js 並加入了 button 和 textarea

03

run.js 定義了點下 button 後的事件

會去分析 textarea 的內容,每一行就是一條 URL

並且呼叫 Chrome API 創建新分頁

chrome.tabs.create({ url: value });

這樣就簡單的完成了一個小工具,非常的簡單

上架

製作完後若想要分享給其他人使用有兩種方式

其中一種就是把原始碼給對方,讓對方按照第二步操作

另外一種方式就是上傳到 Chrome 商店

但會一次性的收取5元美金的費用,最多可以發佈 20 項商品

下面簡單走一次上架的流程

開啟網站 開發人員資訊主頁

點取下方的立即付款

04

付款完成後請回到擴充功能頁面,點選封裝擴充功能,選擇要封裝的目錄

05

金鑰檔案可以不需要,會幫我們產生

完成後會產生一個 pem 檔案跟 crx 檔案

把 pem 檔案重新命名成 key.pem 後放入根目錄中

之後把整個根目錄壓縮成 zip 檔案

回到 開發人員資訊主頁 後點選 新增商品,上傳壓縮好的根目錄

後面會開始填寫一些基本資料,也需要上傳一些介紹圖片之類的

基本上一小時內就可以上架成功

倘若擴充功能需要用到特別的權限會進入人工審核,那就需要幾天的時間

上架成功後就可以讓全部的人安裝使用了

06

擴充功能上架後,OMU

之後若有修改需要上傳新版本的話

先把 manifest.json 內的版本號更新,1.0.0 > 1.0.1

重新壓縮後,再次上傳就行了

07

參考資料

Chrome Extension API

Read more

[LeetCode] #12 Integer to Roman 解題

題目連結 題型解說 這是一題難度為普通的題目 需要設計一個方法,此方法會傳入一個整數 num 要求是把整數轉換成羅馬字母,轉換清單如下 I => 1 V => 5 X => 10 L => 50 C => 100 D => 500 M => 1000 但羅馬字母有一些特殊規則 4 並非 IIII 而是 IV,9 並非 VIIII 而是 IX 這規則同樣可以套用到 40 90 400 900 解題思路 既然知道特殊規則是一樣的,變得是使用的符號,那麼先從 num 取個位數開始 轉換完成後,把 num 除上 10,消除個位數,

By Michael

[LeetCode] #11 Container With Most Water 解題

題目連結 題型解說 這是一題難度為中等的題目 需要設計一個方法,此方法會傳入一個數字陣列 height 陣列中的元素代表每一個柱子的高度 現在需要計算出,該陣列中以某兩隻柱子為邊界,最多可以裝多少水 以範例來說 height = [1,8,6,2,5,4,8,3,7] 最多可以裝 7 * 7 = 49 單位的水 解題思路 計算面積就是底乘上高 底的計算方式為 「右邊柱子的 index」 減去 「左邊柱子的 index」 高就取最短的那一根柱子高度 拿題目給的例子來當範例 建立三個變數 result、left、right left、right 代表左右兩邊的 index result 代表目前最大容量,初始值 0 第一步,找出最短的柱子高度,

By Michael

[LeetCode] #941 Valid Mountain Array 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個數字陣列 arr 判斷陣列中的元素是不是由低到高再從高到低(山形)的排序,且不連續一個以上數字 比如說 [1,2,3,2] 就是一個山形陣列,但 [1,2,2,3,2] 不是,因為有兩個 2 [1,2,3,4,5] 和 [5,4,3,2,1] 也不算是山形陣列,前者只有往上沒有往下,後者相反 解題思路 準備一個數字變數(temp)和布林變數(asc),跑一次迴圈,有可能遇到如下狀況 1. 某個數字與前一個數字相同,這時候直接回傳 false

By Michael

[LeetCode] #944 Delete Columns to Make Sorted 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個字串陣列 strs 這個陣列中每個字串的長度都相同,字串內容都是小寫英文 需要檢查每個元素的第 N 個字元是不是由小至大排列,並回傳有幾個錯誤排列 比如傳入的陣列長這樣 ["cba","daf","ghi"] 取第一個字元 = cdg 取第二個字元 = bah 取第三個字元 = afi 其中第二組的結果(bah)並不是由小至大排列,故回傳 1 解題思路 這一題就用兩個迴圈各別把字元取出來,並比較是否比上一個字元大(Java 中的字元可以直接比較),如果不是就將結果+1 程式碼 Java class Solution { public int minDeletionSize(String[] strs) { int result = 0; for (int i = 0,

By Michael