折腾Chrome插件,让内容脚本与文本交互~

我们要用内容脚本(content scripts)来给插件装上一双慧眼,让它能在你浏览的页面上跳来跳去,和文字做游戏。这就像给插件喂了一颗智慧豆,让它变得聪明起来,能够直接和网页内容打招呼啦!

在本章,我们将介绍如何通过内容脚本(content scripts)增强“智能笔记”插件的页面交互功能。内容脚本的作用是在用户浏览的页面上执行脚本,让我们的插件能够直接与页面内容交互。

manifest.json 更新

首先,我们需要给我们的manifest.json添加对内容脚本的支持,并允许它运行在用户浏览的所有页面上。

{
  "manifest_version": 3,
  "name": "智能笔记",
  "version": "1.0",
  "permissions": [
    "contextMenus",
    "activeTab",
    "storage"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"], // 可以让内容脚本在所有网页上运行
      "js": ["content.js"]       // 指定将要注入的脚本
    }
  ],
  "action": {
    "default_popup": "popup.html",
    "default_icon": "icon.png"
  },
  "icons": {
    "48": "icon.png"
  }
}

在这里,我们添加了一个content_scripts字段,它指定了内容脚本的匹配模式和要注入的脚本文件。matches字段的<all_urls>值告诉Chrome插件需要在所有加载的页面上注入content.js脚本。

content.js

现在,让我们创建content.js来处理选中文本和与背景脚本的交互。

// content.js

// 在页面上监听鼠标抬起事件,以获取用户选择的文本
document.addEventListener('mouseup', function() {
  let selectedText = window.getSelection().toString().trim();
  if (selectedText.length > 0) {
    // 用户选择了文本,我们可以在这里处理文本,比如发送给背景脚本

    // 向背景脚本发送消息
    chrome.runtime.sendMessage({
      action: 'saveText',
      text: selectedText
    }, function(response) {
      // 这里可以处理背景脚本的响应
      console.log(response);
    });
  }
});

content.js中,我们监听了mouseup事件来检测何时用户选择文本。一旦检测到文本被选中,我们就使用chrome.runtime.sendMessage方法将选中的文本和动作类型发送给背景脚本(Service Worker)。背景脚本可以对此消息做出响应,并进行相应的处理,例如保存文本。

我们进一步分析一下这个文件的作用:

content.js脚本中,我们编写代码以实现两个主要功能:一是捕捉用户在页面上选中的文本,二是将这些信息传递给背景脚本(Service Worker)。下面分步骤解释content.js中的相关代码和它们的作用。

捕捉选中文本

首先,我们需要在content.js脚本中添加一个事件监听器,用于捕获用户在页面上选取的文本。这个监听器会在用户执行鼠标抬起动作后触发,因为这通常意味着用户完成了文本的选择。

document.addEventListener('mouseup', function() {
  let selectedText = window.getSelection().toString().trim();
  if (selectedText.length > 0) {
    // 在这里可以添加后续处理选中文本的代码
  }
});

在这段代码中:

  • document.addEventListener('mouseup', function() {...}):添加了一个事件监听器来监听文档的mouseup事件。
  • let selectedText = window.getSelection().toString().trim();:使用window.getSelection()获取用户选中的文本,通过.toString()将其转换为字符串,并通过.trim()移除字符串两端的空白字符。
  • if (selectedText.length > 0) {...}:检查是否有文本被选中(即,选中文本的长度大于0)。
与背景脚本交互

当我们捕捉到用户选中的文本后,我们可能想要对这些文本执行一些操作,例如保存。为此,content.js需将选中的文本发送给背景脚本处理。

// 向背景脚本发送消息
chrome.runtime.sendMessage({
  action: 'saveText',
  text: selectedText
}, function(response) {
  // 这里可以处理背景脚本的响应
  console.log(response);
});

在这段代码中:

  • chrome.runtime.sendMessage({...}, function(response) {...}):通过Chrome的消息传递API发送消息。消息内容是一个对象,包含action(指定动作类型)和text(选中的文本)两个属性。
  • function(response) {...}:是一个回调函数,一旦背景脚本处理完消息并发回响应,这个函数就会被调用。在这个示例中,我们仅将响应内容打印到控制台,但在实际使用中,可以更新页面上的元素,显示保存状态等。

总之,content.js脚本的作用是在页面上运行,监听用户的操作(如文本选择),并与背景脚本通信。这样的分工允许content.js负责页面直接操作,而背景脚本则处理更多全局性或需要持久状态的任务。通过这种方式,我们可以实现不同组件之间的分离和协作,这是扩展开发中的一种常见模式。

background.js 更新

为了响应content.js脚本发送的消息,我们需要在background.js中添加消息监听器。

// background.js

// 监听来自内容脚本的消息
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.action === 'saveText') {
    // 处理保存文本的动作
    console.log('来自内容脚本的文本:', request.text);
    // 存储文本到localStorage或者chrome.storage
    // ...

    // 回复内容脚本
    sendResponse({status: '文本已保存'});
  }

  return true; // 保留消息通道打开,以便异步发送响应
});

在这个更新的background.js中,我们增加了一个监听函数来接收来自内容脚本的消息。当收到saveText动作时,我们会在控制台打印出收到的文本,并模拟保存文本的过程。发送回内容脚本的响应表明文本已被处理。

小结

重新加载插件,刷新网页,同事打开控制台。

选中一段文字,鼠标选中一段,此时应该可以看到打印出了日志。

这就表明,content.js已经生效,我们取得了很大的突破!

在本章节中,我们通过添加内容脚本,让“智能笔记”插件能够与用户浏览的网页直接交互,捕捉用户选中的文本,并将其传递给背景脚本以进行存储和管理。内容脚本和背景脚本之间的通信是通过Chrome提供的消息传递API来实现的。这为我们接下来实现更复杂的页面互动和数据处理奠定了基础。

下一个章节,我们将细化笔记的保存过程,并探讨如何将标记持久化并展示在页面上,提升用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/412633.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学成在线_nacos配置_无法连接到nacos上的配置文件

问题 nacos配置完成后启动程序控制台提示无法连接到数据库 问题原因 无法连接到数据库实际上是没能成功找到nacos上的配置。因为自己的bootstrap文件的拓展名为.yml而不是.yaml。 解决方案 确保nacos上、配置文件中以及配置文件本身的拓展名都是yaml nacos, 如果不是重新创…

2024程序员容器化上云之旅-第2集-Ubuntu-WSL2-Windows11版:接近深洞

故事梗概 Java程序员马意浓在互联网公司维护老旧电商后台系统。 渴望学习新技术的他在工作中无缘Docker。 他开始自学Vue3并使用SpringBoot3完成了一个前后端分离的Web应用系统&#xff0c;并打算将其用Docker容器化后用K8s上云。 3 挑选工具 马意浓画好架构图后&#xff…

动态规划-最长公共子串(c)

动态规划 动态规划&#xff08;dynamic programming&#xff09;是一种算法设计方法。基本思想是在对一个问题的多阶段决策中&#xff0c;按照某一顺序&#xff0c;根据每一步所选决策的不同&#xff0c;会引起状态的转移&#xff0c;最后会在变化的状态中获取到一个决策序列。…

JAVA学习笔记11

1.标识符 1.1 标识符的命名规则和规范 1.1.1 标识符概念 ​ 1.Java对各种变量、方法和类等命名时使用的字符序列称为标识符 ​ 2.凡是自己可以起名字的地方都叫标识符 int num1 90。 1.1.2 标识符的命名规则&#xff08;必须遵守&#xff09; ​ 1.由26个英文字母、数字…

golang学习6,glang的web的restful接口传参

1.get传参 //get请求 返回json 接口传参r.GET("/getJson/:id", controller.GetUserInfo) 1.2.接收处理 package controllerimport "github.com/gin-gonic/gin"func GetUserInfo(c *gin.Context) {_ c.Param("id")ReturnSucess(c, 200, &quo…

redis八股

文章目录 数据类型字符串实现使用场景 List 列表实现使用场景 Hash 哈希实现使用场景 Set 集合实现使用场景 ZSet 有序集合实现使用场景 BitMap实现使用场景 Stream使用场景pubsub为什么不能作为消息队列 数据结构机制SDS 简单动态字符串压缩列表哈希表整数集合跳表quicklistli…

Vue3的8大生命周期

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…

主从复制实现Redis集群

主从复制实现Redis集群实验 (一主二从): 实验环境: 使用Docker 搭建 Redis 版本 5.0.5 打开一个终端窗口&#xff0c;在其中运行如下命令创建一个名为redis-master的Redis容器。注意&#xff0c;它的端口是6379 (本地的端口:映射到容器的端口) docker run -itd--name redis-m…

Shopify使用元字段对产品和产品变体进行自定义配置

引言 在Shopify上运营电子商务店铺时&#xff0c;有时您可能需要对产品和产品变体进行自定义配置。这可以包括添加额外的属性、规格或其他自定义字段&#xff0c;以满足特定的业务需求。Shopify提供了元字段的功能&#xff0c;使您能够灵活地自定义产品和产品变体的配置。在本…

[Docker 教学] 常用的Docker 命令

Docker是一种流行的容器化技术。使用Docker可以将数据科学应用程序连同代码和所需的依赖关系打包成一个名为镜像的便携式工件。因此&#xff0c;Docker可以简化开发环境的复制&#xff0c;并使本地开发变得轻松。 以下是一些必备的Docker命令列表&#xff0c;这些命令将在你下一…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的动物识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本博客文章深入解析了基于深度学习的动物识别系统的完整代码&#xff0c;并展示了采用领先的YOLOv8算法的实现代码。该系统与YOLOv7、YOLOv6、YOLOv5等早期版本的性能进行了比较&#xff0c;可以从静态图像到实时视频流的各种媒介中识别动物的高效性和准确性。…

html中的meta 元信息

html中的meta 元信息 1. 配置字符编码 <meta charset"utf-8">2. 针对 IE 浏览器的兼容性配置。 <meta http-equiv"X-UA-Compatible" content"IEedge">3. 针对移动端的配置 <meta name"viewport" content"widt…

【Git教程】(四)版本库 —— 存储系统,存储目录,提交对象及其命名、移动与复制~

Git教程 版本库 1️⃣ 一种简单而高效的存储系统2️⃣ 存储目录&#xff1a;Blob 与 Tree3️⃣ 相同数据只存储一次4️⃣ 压缩相似内容5️⃣ 不同文件的散列值相同6️⃣ 提交对象7️⃣ 提交历史中的对象重用8️⃣ 重命名、移动与复制&#x1f33e; 总结 事实上&#xff0c;我们…

Flutter Version Manager (FVM): Flutter的版本管理终极指南

Flutter笔记 Flutter Version Manager (FVM) - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/136300307 my-websit…

git push 总是需要输入密码或者个人访问令牌personal access token解决方案

文章目录 遇到问题解决方法 遇到问题 git push的时候总是需要输入密码或者个人访问令牌personal access token 解决方法 ChatGPT给出的解决方案&#xff0c;解决了我的问题。 如果在使用 git push 命令时总是需要输入个人访问令牌&#xff0c;这可能是因为您的 GitHub 账号…

CUDA编程 - 用向量化访存优化 - Cuda elementwise - Add(逐点相加)- 学习记录

Cuda elementwise - Add 一、简介1.1、ElementWise Add1.2、 float4 - 向量化访存 二、实践2.1、如何使用向量化访存2.1、简单的逐点相加核函数2.2、ElementWise Add float4&#xff08;向量化访存&#xff09;2.3、完整代码 一、简介 1.1、ElementWise Add Element-wise 操作…

27.HarmonyOS App(JAVA)可复用列表项的ListContainer

可复用列表项的ListContainer 简短的列表可以通过定向布局实现,但是如果列表项非常多,则使用定向布局就不再合适。如需要创建50个列表项的列表,那么用定向布局实现至少需要创建50个以上的组件了。然而,限于设备屏幕大小的限制,绝大多数组件不会显示在屏幕上,却会占据大量的内存…

CentOS 7.9.2009离线安装mysql 8.0客户端 (rpm包)

环境&#xff1a; #需求&#xff1a; 该服务器需要将csv文件入库到远端的mysql 服务器上。 CentOS Linux release 7.9.2009 (Core) 离线环境 &#xff0c;需安装mysql客户端 8.0.27#下载地址 https://downloads.mysql.com/archives/community/#按此顺序安装 rpm -ivh mysql…

C++ //练习 9.16 重写上一题的程序,比较一个list<int>中的元素和一个vector<int>中的元素。

C Primer&#xff08;第5版&#xff09; 练习 9.16 练习 9.16 重写上一题的程序&#xff0c;比较一个list中的元素和一个vector中的元素。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************************…

AMEYA360 | 罗姆的EcoGaN™被台达电子Innergie品牌的45W输出AC适配器“C4 Duo”采用!

全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)的650V GaN器件(EcoGaN™)&#xff0c;被台达电子(Delta Electronics, Inc.&#xff0c;以下简称“台达”)Innergie 品牌的45W输出AC适配器(快速充电器)“C4 Duo” 采用。台达是基于IoT技术的绿色解决方案全球供应商。Inn…