【Chrome Extension】二、导航栏快速查询

embedded/2024/12/28 2:42:27/

【Chrome Extension】二、导航栏快速查询

    • 介绍
    • 插件内容
        • 1、目录
        • 2、manifest.json
        • 3、service-worker.js
        • 4、sw-omnibox.js
        • 5、sw-tips.js
        • 6、content.js

介绍

导航栏,输入fei,然后tab可进入当前扩展:Quick Query FeiFeiYeChuan CSDN Blogs,然后输入内容,即可在FeiFeiYeChuan博客下查找相关技术内容。
在这里插入图片描述
在博客的导航栏插入 Tip 按钮,点击按钮,界面中间显示“Quick Redirect To FeiFeiYeChuan”的快速导航。点击即可快速进入博客主页。
在这里插入图片描述

插件内容

1、目录

在这里插入图片描述

2、manifest.json
{"manifest_version": 3,"name":"Quick Query FeiFeiYeChuan CSDN Blogs","version": "1.0.0","icons": {"16": "images/icon16.png","32": "images/icon16.png","64": "images/icon16.png"},"background":{      # background 随浏览器运行"service_worker": "service-worker.js","type": "module"},"permissions":["storage", "alarms"],   # 内存权限和闹钟定时权限"minimum_chrome_version": "102","omnibox":{"keyword": "fei"   # 使用导航栏,必须用到omnibox。关键字是 fei。},"host_permissions": ["https://extension-tips.glitch.me/*"],"content_scripts": [			# content内容{"matches": ["https://*.csdn.net/*","https://blog.csdn.net/*","https://*/blog.csdn.net/*"],"js": ["content.js"]}]
}
3、service-worker.js
import './sw-omnibox.js';	// 导入js文件
import './sw-tips.js';// Save default API suggestions
chrome.runtime.onInstalled.addListener(({ reason }) => {console.log("reason:", reason)if (reason === 'install') {			// 安装完成插件chrome.storage.local.set({apiSuggestions: ['Python', 'Django', 'Freeswitch']});console.log("apiSuggestions:", chrome.storage.local.get("apiSuggestions"))}if (reason === 'update') {			// 更新插件chrome.storage.local.set({apiSuggestions: ['Python', 'Django', 'Freeswitch']});console.log("apiSuggestions:", chrome.storage.local.get("apiSuggestions"))}});
4、sw-omnibox.js
console.log("sw-omnibox.js")const URL_CHROME_EXTENSIONS_DOC ='https://so.csdn.net/so/search?t=blog&u=feifeiyechuan&q=';      // 指定博客下查询内容
const NUMBER_OF_PREVIOUS_SEARCHES = 4;// Display the suggestions after user starts typing
chrome.omnibox.onInputChanged.addListener(async (input, suggest) => {   // omibox内容改变事件await chrome.omnibox.setDefaultSuggestion({description: '输入FeiFeiYeChuan关键查询'                  });const { apiSuggestions } = await chrome.storage.local.get('apiSuggestions');console.log("111apiSuggestions:", apiSuggestions)const suggestions = apiSuggestions.map((api) => {return { content: api, description: `Open CSDN FeiFeiYeChuan.${api}` };});console.log("222suggestions:", suggestions)suggest(suggestions);
});// Open the reference page of the chosen API
chrome.omnibox.onInputEntered.addListener((input) => {   // omibox回车事件console.log("chrome.tabs:", chrome.tabs)chrome.tabs.create({ url: URL_CHROME_EXTENSIONS_DOC + input });console.log("chrome.tabs:", chrome.tabs)// Save the latest keywordupdateHistory(input);
});async function updateHistory(input) {  // 更新内存apiSuggestionsconst { apiSuggestions } = await chrome.storage.local.get('apiSuggestions');console.log("apiSuggestions:", apiSuggestions)apiSuggestions.unshift(input);console.log("apiSuggestions:", apiSuggestions)apiSuggestions.splice(NUMBER_OF_PREVIOUS_SEARCHES);console.log("apiSuggestions:", apiSuggestions)return chrome.storage.local.set({ apiSuggestions }); }
5、sw-tips.js
console.log("sw-tips.js")
// Fetch tip & save in storage
const updateTip = async () => {const tips = ["<p><a href='https://blog.csdn.net/feifeiyechuan'>Quick Redirect To FeiFeiYeChuan</a></p>","<p><a href='https://blog.csdn.net/feifeiyechuan'>Quick Redirect To FeiFeiYeChuan</a></p>","<p><a href='https://blog.csdn.net/feifeiyechuan'>Quick Redirect To FeiFeiYeChuan</a></p>","<p><a href='https://blog.csdn.net/feifeiyechuan'>Quick Redirect To FeiFeiYeChuan</a></p>","<p><a href='https://blog.csdn.net/feifeiyechuan'>Quick Redirect To FeiFeiYeChuan</a></p>","<p><a href='https://blog.csdn.net/feifeiyechuan'>Quick Redirect To FeiFeiYeChuan</a></p>","<p><a href='https://blog.csdn.net/feifeiyechuan'>Quick Redirect To FeiFeiYeChuan</a></p>",];const randomIndex = Math.floor(Math.random() * tips.length);return chrome.storage.local.set({ tip: tips[randomIndex] });};const ALARM_NAME = 'tip';// Check if alarm exists to avoid resetting the timer.// The alarm might be removed when the browser session restarts.async function createAlarm() {const alarm = await chrome.alarms.get(ALARM_NAME);if (typeof alarm === 'undefined') {chrome.alarms.create(ALARM_NAME, {delayInMinutes: 1,periodInMinutes: 1440});updateTip();}}chrome.alarms.clearAll()createAlarm();// Update tip once a daychrome.alarms.onAlarm.addListener(updateTip);// Send tip to content script via messaging
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {   // 接受content         if (message.greeting === 'tip') {console.log("chrome.storage.local.get('tip'):", chrome.storage.local.get('tip'))chrome.storage.local.get('tip').then(sendResponse);return true;}});
6、content.js
(async () => {// Sends a message to the service worker and receives a tip in responseconst { tip } = await chrome.runtime.sendMessage({ greeting: 'tip' });const nav1 = document.querySelector('.toolbar-container-left');const vip = document.querySelector('.toolbar-btn-vip');const nav = nav1? nav1: vip;const tipWidget = createDomElement(`<button type="button" popovertarget="tip-popover" popovertargetaction="show" style="padding: 0 12px; height: 36px;background:red;line-height:36px;"><span style="display: block; font: var(--devsite-link-font,500 14px/20px var(--devsite-primary-font-family));">Tip</span></button>`);const popover = createDomElement(`<div id='tip-popover' popover style="margin: auto;">${tip}</div>`);document.body.append(popover);nav.append(tipWidget);})();function createDomElement(html) {const dom = new DOMParser().parseFromString(html, 'text/html');return dom.body.firstElementChild;}

http://www.ppmy.cn/embedded/148687.html

相关文章

Ruby+Selenium教程

什么是 Minitest&#xff1f; Minitest 是 Ruby 的测试框架&#xff0c;提供一整套测试工具。它运行速度快&#xff0c;支持 TDD、BDD、模拟和基准测试 以下是使用Ruby、Selenium WebDriver和Minitest 的脚本&#xff0c;用于断言 Restful Booker Platform 的“页面标题”等于…

Log4j1.27配置日志输出级别不起效

起因&#xff1a;构建独立版本debezuim使用时&#xff0c;日志一直打印debug信息。 原因&#xff1a;包冲突问题&#xff0c;进行排包操作。 参考log4j日志级别配置完成后不生效 系统一直打印debug日志_log4j不起作用-CSDN博客 1、application.properties logging.configc…

UDP的报文结构和特点

1.UDP传输协议的特点 使用UDP传输协议进行通信&#xff0c;过程类似于寄信&#xff0c;它的特点如下&#xff1a; 无连接&#xff1a;知道对端的IP号和端口号就直接进行传输&#xff0c;不需要建立连接&#xff1b;不可靠&#xff1a;没有可靠机制&#xff0c;发送数据包以后&a…

1.BMS电池管理系统的基础知识总结

我们常说的电动汽车核心三电部件,即大三电分别为电机、电控、电池,小三电为车载充电机、DCDC转换器、高压配电盒,其中动力电池系统占电动汽车成本40~ 50%左右,所以在动力电池有补贴高峰时,新能源汽车相当便宜,BMS作为动力电池系统中的灵魂而在,大约占动力电池成本的15~1…

Blazor项目中使用EF读写 SQLite 数据库

《信管通低代码信息管理系统应用平台》开发环境就是Blazor&#xff0c;其中的数据库访问就是使用SQLite数据库。SQLite 是一种轻量级的嵌入式数据库&#xff0c;具有以下优点&#xff1a; 1. 轻量级 小巧易用&#xff1a;SQLite 只需要一个动态库或单个文件&#xff0c;库的大…

美畅物联丨分布式锁实战:Spring Boot项目中的Redis应用

在分布式系统里&#xff0c;多个节点或许会同时对共享资源进行访问与操作。为防止出现数据不一致、资源竞争等状况&#xff0c;就需要一种机制来对这些并发访问加以协调&#xff0c;于是分布式锁就出现了。它如同一把全局的钥匙&#xff0c;在同一时刻仅有一个节点能够获取该钥…

【HarmonyOS 5.0】第十二篇-ArkUI公共属性(一)

一、公共样式类属性 ArkUI框架提供的基础组件直接或者间接的继承自 CommonMethod &#xff0c; CommonMethod 中定义的属性样式属于公共样式。下面就来学习这些样式 1.1.尺寸设置 宽高设置 设置组件的宽高&#xff0c;缺省时使用组件自身内容的宽高&#xff0c;比如充满父布…

信息安全管理与评估赛题第9套

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 赛题九 模块一 网络平台搭建与设备安全防护 1 赛项时间 共计180分钟。 2 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 任务1 网络平台搭建 XX:XX- XX:XX 50 任务2…