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

news/2024/12/27 19:13:41/

【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/news/1558060.html

相关文章

批量生成二维码,助力数字化管理-Excel易用宝

今天老板给我一份表格&#xff0c;说是要提高企业数字化管理效率&#xff0c;让我把这张表格中的商品编号、材料名称、规格的信息合并到一列&#xff0c;然后将这些商品信息制作生成二维码。 这活可真不好办啊&#xff0c;&#xff0c;我先想想哈&#xff01; 先使用公式将商品…

探索 ES6 基础:开启 JavaScript 新篇章

文章目录 一、ES6 简介与重要性二、变量声明新方式&#xff08;一&#xff09;let 关键字&#xff08;二&#xff09;const 关键字 三、模板字符串四、箭头函数五、函数参数默认值六、Spread / Rest 操作符&#xff08;一&#xff09;Spread 操作符&#xff08;二&#xff09;R…

Wux weapp 组件库的 bug—— wux-picker选择器组件无法正确初始化到选定的value

options的value为Number&#xff0c;组件无法正常使用 解决方案&#xff0c;修改picker-view/utils.js中的getIndexFromValue函数&#xff0c;如下&#xff1a; export function getIndexFromValue(value, col [], fieldNames DEFAULT_FIELD_NAMES) {//return getRealIndex(…

MFC/C++学习系列之简单记录7

MFC/C学习系列之简单记录7 前言句柄的介绍句柄的使用AFX开头的函数都是干什么用的&#xff1f;总结 前言 在MFC的使用中发现了句柄&#xff0c;今天来详细学习一下MFC中如何使用句柄吧&#xff01; 句柄的介绍 句柄的使用是资源管理和传递的关键机制&#xff0c;通过句柄将系…

KTP112 系列高性能、低功耗、数字温度传感器

KTP112是一款高精度、低功耗、可替代NTC / PTC 热敏电阻的数字温度传感器&#xff0c;可用于通信、计算机、 消费类电子、环境、工业和仪器仪表应用中的温度 测量。 KTP112在-40C至125C的正常工作范围 内&#xff0c;可提供 0.5C的温度精度&#xff0c;并具有良好的温度 线…

JSON 系列之1:将 JSON 数据存储在 Oracle 数据库中

本文为Oracle数据库JSON学习系列的第一篇&#xff0c;讲述如何将JSON文档存储到数据库中&#xff0c;包括了版本为19c和23ai的情形。 19c中的JSON 先来看一下数据库版本为19c时的情形。 创建表colortab&#xff0c;其中color列的长度设为4000。若color的长度需要设为32767&a…

HDFS与HBase有什么关系?

1 、 HDFS 文件存储系统和 HBase 分布式数据库 HDFS 是 Hadoop 分布式文件系统。 HBase 的数据通常存储在 HDFS 上。 HDFS 为 HBase 提供了高可靠性的底层存储支持。 Hbase 是 Hadoop database ,即 Hadoop 数据库。它是一个适合于非结构化数据存储的数据库, HBase 基于列的…

golang 熔断限流降级

限流 - 2k 但是我的服务能力只有1k&#xff0c;所以这个时候多出来的流量怎么办&#xff1a; 1. 拒绝 2. 排队等待。用户体验不太好&#xff1a; 当前访问用户过多&#xff0c;请稍后重试和你的服务直接挂了 用户体验降级了 - 原本是访问流畅&#xff0c;下单流畅 -> 当前访…