【Chrome Extension】一、CSDN计时扩展设计

embedded/2024/12/24 8:59:05/

【Chrome Extension】一、CSDN计时扩展设计

    • 重点内容
      • 内容脚本 content_scripts
    • 文件目录
        • 1、整体目录
        • 2、manifest.json
        • 3、scripts/content.js
        • 4、css/content.css

重点内容

在这里插入图片描述

内容脚本 content_scripts

1、manifest.json文件配置

{"manifest_version": 3,		# *依赖Chrome插件版本"name": "FeiFeiYeChuan-Tools-CSDN Article Reading Time", # *插件名称"version": "1.0", # *插件版本"description": "Add the reading time to Chrome Extension documentation articles","icons": { # 不同情况下显示的图标"16": "images/logo.png","32": "images/logo.png","48": "images/logo.png","128": "images/logo.png"},"content_scripts": [ # content内容{"js": ["scripts/content.js"],"css": ["css/content.css"],"matches": ["https://*.blog.csdn.net/*","https://blog.csdn.net/*"]}]
}

如上 content_scripts内容脚本:运行读取和修改网页内容的脚本) 主要用于在固定 matches 网页下的执行脚本内容,他们独立于其他扩展程序和托管页面,拥有独立的js,css脚本。

文件目录

1、整体目录

在这里插入图片描述

2、manifest.json
{"manifest_version": 3,"name": "FeiFeiYeChuan-Tools-CSDN Article Reading Time","version": "1.0","description": "Add the reading time to Chrome Extension documentation articles","icons": {"16": "images/logo.png","32": "images/logo.png","48": "images/logo.png","128": "images/logo.png"},"content_scripts": [{"js": ["scripts/content.js"],"css": ["css/content.css"],"matches": ["https://*.blog.csdn.net/*","https://blog.csdn.net/*"]}]
}
3、scripts/content.js
onload = function () {console.log("content.js已加载");const article = document.querySelector(".blog-content-box");console.log('article:', article)// `document.querySelector` may return null if the selector doesn't match anything.if (article) {const text = article.textContent;// console.log('text:', text)const wordMatchRegExp = /\w/g; // Regular expressionconst words = text.matchAll(wordMatchRegExp);// matchAll returns an iterator, convert to array to get word countconst wordCount = [...words].length;console.log("wordCount:", wordCount)const readingTime = Math.round(wordCount / 200);const badge = document.createElement("p");// Use the same styling as the publish information in an article's headerbadge.classList.add("color-secondary-text", "type--caption", 'light');badge.textContent = `⏱️ ${readingTime} min read`;// Support for API reference docsconst heading = document.querySelector(".title-article");heading.insertAdjacentElement("afterend", badge);}
}
4、css/content.css
.light{color: #77a000;
}

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

相关文章

Debian 10上使用UFW设置防火墙

介绍 UFW或Uncomplicated Firewall是iptables一个接口,旨在简化配置防火墙的过程。 虽然iptables是一个可靠而灵活的工具,但初学者很难学会如何使用它来正确配置防火墙。 如果您希望开始保护网络并且不确定使用哪种工具,UFW可能是您的正确选…

Springboot+Druid(可切换Hikari)+Mybatis-plus+mysql+hive的多数据源项目配置

1.搭建一个springboot项目&#xff0c;不会的搜一下&#xff0c;很简单这里不做赘述。 2.首先你搭建的springboot能正常启动之后&#xff0c;pom文件添加如下依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>druid</arti…

springboot根据租户id动态指定数据源

代码地址 码云地址springboot根据租户id动态指定数据源: springboot根据租户id指定动态数据源,结合mybatismysql多数源下的事务管理 创建3个数据库和对应的表 sql脚本在下图位置 代码的执行顺序 先设置主数据库的数据源配置目标数据源和默认数据源有了主库的数据源&#xff…

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(…

Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署

在现代软件开发中&#xff0c;容器化技术已成为提升应用部署和管理效率的关键工具。Java应用由于其庞大的依赖性和较大的体积&#xff0c;常常在传统环境下部署存在挑战。幸运的是&#xff0c;Docker和Kubernetes的出现为Java应用的开发、部署和管理带来了极大的便利。本文将介…

学习记录:electron主进程与渲染进程直接的通信示例【开箱即用】

electron主进程与渲染进程直接的通信示例 1. 背景&#xff1a; electronvue实现桌面应用开发 2.异步模式 2.1使用.send 和.on的方式 preload.js中代码示例&#xff1a; const { contextBridge, ipcRenderer} require(electron);// 暴露通信接口 contextBridge.exposeInMa…

Ubuntu Netlink 套接字使用介绍

Netlink 套接字 是 Linux 特有的一种 IPC&#xff08;进程间通信&#xff09;机制&#xff0c;用于用户态进程和内核模块之间的通信。它可以用来完成路由管理、设备通知、网络状态更新等任务。 1. Netlink 的基本工作原理 Netlink 是一种双向通信机制。Netlink 消息分为请求和…

uni-app 统一请求处理 请求拦截器 响应拦截器 请求封装

封装API接口 import {http} from ../utils/request.js export function login(code){return http({url:/wx/getSession,method: GET,data:{code}}) }调用接口 import {login,test,phoneMessage,updateAvatar} from ../../api/user.js function userLogin(){ login(code.value…