当前位置: 首页 > article >正文

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

【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 keyword
  updateHistory(input);
});

async function updateHistory(input) {  // 更新内存apiSuggestions
    const { 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 day
  chrome.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 response
    const { 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.kler.cn/a/448980.html

相关文章:

  • <论文>初代GPT长什么样?
  • 对于其他管理的理解(中)
  • GOC编程 第2课 简单命令---直走和转弯命令
  • 重拾设计模式--备忘录模式
  • 在安卓Android应用中实现二维码图像的保存与条形码文本合并
  • SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频
  • 探索CSDN博客数据:使用Python爬虫技术
  • 有没有检测吸烟的软件 ai视频检测分析厂区抽烟报警#Python
  • 自定义一个maven骨架 | 最佳实践
  • JavaScript中函数调用时的参数传递
  • 华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数
  • etcd+京东hotkey探测使用
  • C++ 中的 Lambda 表达式:函数式编程的利器
  • 深入浅出:多功能 Copilot 智能助手如何借助 LLM 实现精准意图识别
  • 关于稀疏数据的模型选择
  • GESP2级2403 小杨的日字矩阵
  • ISP图像处理简介
  • SpringCloud 入门(3)—— Nacos配置中心
  • 短视频矩阵系统种类繁多,应该如何对比选择?
  • 使用Python实现智能家居控制系统:开启智慧生活的钥匙
  • 【Linux】资源隔离机制 — 命名空间(Namespace)详解
  • Python实战:基于表单的暴力破解——以Pikachu靶机系统为例
  • vue中使用echarts做一个基础可滚动的折线图及dataZoom滚动配置项
  • SQL,生成指定时间间隔内的事件次序号
  • Hadoop完全分布式环境部署
  • malloc 分配大堆块(128KB)的一次探索