Chrome扩展中的界面

    科技2022-07-29  108

    图标弹窗(popup)

    注册:

    在清单文件的浏览器行为(browser_action),添加默认弹窗(default_popup)

    { "name": "My Extension", "version": "2.1", "description": "Gets information from Google.", "icons": { "128": "icon_16.png", "128": "icon_32.png", "128": "icon_48.png", "128": "icon_128.png" }, "background": { "persistent": false, "scripts": ["background_script.js"] }, "permissions": ["https://*.google.com/", "activeTab"], "browser_action": { "default_icon": "icon_16.png", "default_popup": "popup.html" } }

    编写

    编写popup.html,就可以在弹窗的展示出来。 比如下面的HelloWorld入门程序

    清单 { "name": "HelloWorld", "version": "1.0.0", "manifest_version": 2, "description": "This a extension with a UI of HelloWorld", "icons": { "128": "image/image128.png", "48": "image/image48.png", "16": "image/image16.png" }, "browser_action": { "default_icon": "image/image16.png", "default_popup": "popup.html" } } popup.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>HelloWorld</title> <script src="jquery-3.5.1.min.js"> </script> <script src="popup.js"></script> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <h1 id="greet">Hello World!</h1> <input type="text" id="name"> </body> </html> popup.js $(function (){ $('#name').keyup(function () { $('#greet').text('Hello '+$('#name').val()) }) })

    注意文件存放的位置,不然可能识别不到。

    选项页

    注册

    { "name": "My extension", ... "options_page": "options.html", ... }

    编写

    编写好选项页,会在标签页中展示。

    用法

    选项页与其他脚本的通信是通过,Chrome的API,比如storage,runtime等,下面有一个预算计算器,展示了弹窗,选项页,以及后台脚本之间如何通过ChromeAPI进行交流。chromeAPI如何使用参考官方文档,一般来说存贮数据storage使用set,get方法,set,一个参数接受一个键值对,第二个参数是回调函数,get方第一个参数接受键,并传入一个回调函数。

    chrome.storage.sync.set({key: value}, function() { console.log('Value is set to ' + value); }); chrome.storage.sync.get(['key'], function(result) { console.log('Value currently is ' + result.key); });

    示例

    清单 { "manifest_version": 2, "version": "1.0", "name":"Budget Manager", "description": "This is a extension that helps you manager bill", "icons": { "128": "image/image128.png", "48": "image/image48.png", "16": "image/image16.png" }, "browser_action": { "default_icons": "image/image/16", "default_popup": "popup.html" }, "background": { "scripts": ["eventPage.js"], "persistent": false }, "options_page": "option.html", "permissions": [ "storage", "notifications", "contextMenus" ] } popup.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Budget Manager</title> <script src="jquery-3.5.1.min.js"></script> <script src="popup.js"></script> </head> <body> <h1>Budget Manager</h1> <h2>Total Spend:<span id="total">0</span></h2> <h2>limit:<span id="limit"></span></h2> <h3>Enter Amount:</h3> <input type="text" id="amount"/> <input type="submit"id="spendAmount" value="Spend"> </body> </html> popup.js $(function (){ chrome.storage.sync.get(['total','limit'],function (budget){ $('#total').text(budget.total) $('#limit').text(budget.limit) }) $('#spendAmount').click(function () { chrome.storage.sync.get(['total','limit'],function (budget){ let newTotal=0; if(budget.total){ newTotal+=parseInt(budget.total) } let amount = $('#amount').val(); if(amount){ newTotal+=parseInt(amount) } chrome.storage.sync.set({'total':newTotal},function () { if(amount>=budget.limit && newTotal >=budget.limit){ let notifOptions={ type:'basic', iconUrl:'image/image48.png', title:'Out of limit', message:"Please Reset the total or limit" }; chrome.notifications.create('LimitNotification',notifOptions) } }); $('#total').text(newTotal) $('#amount').val('') }) }) }) option.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Budget Manager Options</title> <script src="jquery-3.5.1.min.js"></script> <script src="option.js"></script> </head> <body> <h1>Budget Manager Options</h1> <h2>Limit:<input type="text" id="limit"></h2> <input type="submit" id="saveLimit" value="Save Limit"> <input type="submit" id="resetTotal" value="Reset Total"> </body> </html> option.js $(function () { chrome.storage.sync.get('limit',function (budget) { $('#limit').val(budget.limit) }) $('#saveLimit').click(function () { let limit=$('#limit').val() chrome.storage.sync.set({'limit':limit},function () { close() }) }) $('#resetTotal').click(function () { chrome.storage.sync.set({'total':0}) }) })

    上下文菜单

    沙拉查词中有很多菜单,内容十分丰富。我们通过chromeAPI的contextMenus实现这种效果

    注册:

    { "name": "My extension", ... "permissions": [ "contextMenus" ], "icons": { "16": "icon-bitty.png", "48": "icon-small.png", "128": "icon-large.png" }, ... }

    请求权限后便可以使用这一API

    用法

    creat,update,remove,removeAll,他们接受的参数大体相同

    上下文菜单显示有两个位置,页面和图标,下图是页面右击的菜单

    上下文菜单要想在图标出显示,须在contexts属性设为broswe_action

    实例:

    chrome.contextMenus.create({ id:"wordbook", contexts:["browser_action"], title:"生词本" }) chrome.contextMenus.onClicked.addListener(function (clickData) { if(clickData.menuItemId=="wordbook"){ chrome.tabs.create({url:"wordbook.html"}) })

    页面弹窗

    页面弹窗采用Js注入的方式,在chrome能访问网页dom的脚本只有content_script,以来这一特性,可以利用内容脚本向网页注入js

    注册:

    { "manifest_version": 2, "name": "Killer", "version": "1.0", "description": "This a extension that handles SB_ZHI_HU", "icons": { "128": "image/image128.png", "48": "image/image48.png", "16": "image/image16.png" }, "content_scripts":[ { "matches": ["https://www.zhihu.com/*","http://223.2.10.172/*"], "js": ["jquery-3.5.1.min.js","content.js"] } ], "permissions": [ "https://www.zhihu.com/*", "http://223.2.10.172/*" ] }

    用法:

    let popContent=" <div class=\"pop\" style=\"width: 100px;height: 100px\">\n" + " <style type=\"text/css\">\n" + " .pop{\n" + " position: absolute;\n" + " left: 20px;\n" + " top:60px;\n" + " background-color:rgba(0,0,0,0);\n" + " border: solid 2px;\n" + " }\n" + " </style>\n" + " <button id=\"close\">关闭</button>\n" + "</div>" $("body").append(popContent) $("#close").on("click",function () { $("div.pop").remove() })

    效果: 点击关闭:

    其他方式——后台注入:

    利用后台脚本在标签页打开时也可以注入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' }); } });

    下面这个沙拉查词的弹窗就做得很好看

    其他:

    WebStorm可以导入JS的chrome库,编写效率会大大提高:沙拉查词开源而且界面好看,基本涉及到了所有知识,值得我们去学习。 Github:https://github.com/crimx/ext-saladict
    Processed: 0.013, SQL: 8