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

Chrome扩展程序开发随记

在Chrome浏览器向正被浏览的外网网页植入自定义JS脚本

为了实现如标题的目的,需要开发一个Chrome扩展程序。接下来内容是实现简要步骤:

一、新建文件夹,命名为项目名,如“MyPlugin”。

二、进入文件夹内,新建名为“manifest.json”的文件,向其写入以下内容:

{"manifest_version": 2,"name": "My Plugin","version": "1.0.0","description": "Hello, Chrome Plugin","icons":{"16": "icon.png","48": "icon.png","128": "icon.png"},"content_scripts": [{"matches": ["https://*.baidu.com/*"],"js": ["Constant.js", "Public.js", "MyPlugin.js"],"run_at": "document_idle"}]
}

重点关注"content_scripts"字段:

  1. 代码中"matches"指将自定义JS脚本植入目标网页URL。*为通配符,代表0个或n个字符。

  2. "js"指在项目文件夹的自定义植入目标网页URL的JS脚本文件。标明后它们之间的对象、函数可互相引用。

  3. “run_at"指JS脚本文件执行时刻,缺省值为"document_idle”,表示页面空闲时。可选值还有"document_start"和"document_end",顾名思义。

三、接着是安装部署,在Chrome浏览器打开“扩展程序”管理界面。

基于Chrome内核浏览器打开方法都大同小异,不是在浏览器菜单栏找出“扩展程序”,就是直接在地址栏写入"chrome://extensions"然后回车。

四、在“扩展程序”管理界面勾选“开发者模式”,然后点击“加载已解压的扩展程序”,选择项目文件夹,确定后便完成安装部署。

开发注意事项:

  1. 植入自定义JS脚本可操控页面的DOM,但不能直接控制页面JS(变量、方法)。虽然不能直接,但可间接,方法就是向页面插入script元素,具体操作请查看参考[2]。
  2. 开发过程中,修改自定义JS脚本内容并不能实时反映到浏览器中,需要按Ctrl+R或在“扩展程序”管理界面在点击“Reload”。
  3. 在后台调试自定义JS脚本:按F12打开后台,在“Console”tab页点击选择top下拉菜单,选择自定义扩展程序,如上文示例“My Plugin”,接着便可访问自定义JS中变量等内容。

用JS发送GET消息

传统解决方法是使用XMLHttpRequest对象:

function GET(url, handleFunc){var httpRequest = new XMLHttpRequest()httpRequest.open('GET', url, true)httpRequest.send()httpRequest.onreadystatechange = function(){if (httpRequest.readyState == 4 && httpRequest.status == 200) {var responseText = httpRequest.responseText// console.log("responseText:")// console.log(responseText)if(handleFunc) handleFunc(responseText)}};
}

XMLHttpRequest是一种从JavaScript发送GET请求的旧方法,几乎所有浏览器都支持它。XMLHttpRequest可以发送和接收任何类型的数据,包括JSON、XML、文本等。它的使用主要是出于历史原因,因为有很多基于XMLHttpRequest的遗留代码,并且需要支持较旧的浏览器。

新的解决方法是使用Fetch API:

fetch(url, {headers: {'Accept': 'application/json'}
}).then(response => response.text()).then(text => console.log(text))

Fetch API是一个内置于大多数web浏览器中的现代接口,它为生成HTTP请求提供了强大而灵活的方法。与XMLHttpRequest(XHR)不同,Fetch API是基于promise-based的,这使得发送HTTP请求更加容易,并为您提供了一个更简单、更干净的API,而无需嵌套回调。Fetch API支持GET、POST、DELETE和其他请求方法,可以检索和发送数据,包括文本、JSON和二进制数据。Fetch API是XMLHttpRequest的最佳替代方案,可以轻松地与其他技术(如Service Workers)集成。

XMLHttpRequest相对于Fetch的唯一优点是Fetch还不能跟踪向服务器发送数据的进度。在Fetch API之前,从JavaScript发送请求是相当尴尬的。这就产生了几个流行的JavaScript库(jQuery、Axios等),它们使从JavaScript发送GET和POST请求变得简单,并且可以在XMLHttpRequest之上工作。

用JS发送POST消息

传统解决方法是用创建form元素迂回发送POST消息:

function POST(url, params) {var temp = document.createElement("form")temp.action = urltemp.method = "post"temp.style.display = "none"for (var x in params) {var opt = document.createElement("input")opt.name = xopt.value = params[x]temp.appendChild(opt)}document.body.appendChild(temp)temp.submit()return temp;
}POST('/my/url', {a:'3', b:'2', c:'1'})

或者像上一节GET那样创建使用XMLHttpRequest对象发送POST消息:

function POST(url, data){var httpRequest = new XMLHttpRequest();httpRequest.open("POST", url, true);httpRequest.setRequestHeader("Content-Type", "application/json");httpRequest.onreadystatechange = function () {if (httpRequest.readyState == 4 && httpRequest.status == 200) {//TODO:}}httpRequest.send(JSON.stringify(data));
}POST('/my/url', {a:'3', b:'2', c:'1'})

新的解决方法是使用Fetch API:

fetch('https://reqbin.com/echo/post/json', {method: 'POST',headers: {'Accept': 'application/json','Content-Type': 'application/json'},body: JSON.stringify({ "id": 78912 })
})
.then(response => response.json())
.then(response => console.log(JSON.stringify(response)))

Fetch API的简要概述可看上一节,具体参考[7]。

用JS将文本内容直接复制到系统剪贴板

function copyTextToClipboard(text) {var textArea = document.createElement("textarea");textArea.value = text;document.body.appendChild(textArea);textArea.select();document.execCommand("copy");document.body.removeChild(textArea);
}copyTextToClipboard("要复制的内容");

调用execCommand()还可以实现浏览器菜单的很多功能,如保存文件、打开新文件、撤消、重做操作…等等。参考[4]

用JS快速查找数据

一、使用对象

let data = {'Alice': 25,'Bob': 30,'Charlie': 35,'David': 40
};console.log(data['Alice']); // 25

二、使用数组

使用数组来存储数据,然后使用一些高效的算法来实现快速查找。

二分搜索可以说是最高效的排序算法,不过要是先对数组进行排序操作。

let data = [25, 30, 35, 40];function binarySearch(arr, key) {let low = 0;let high = arr.length - 1;while (low <= high) {let mid = Math.floor((low + high) / 2);if (arr[mid] === key) {return mid;} else if (arr[mid] < key) {low = mid + 1;} else {high = mid - 1;}}return -1;
}console.log(binarySearch(data, 30)); // 1

三、使用Set

Set是一种新的数据类型,可以用来存储不重复的值。在JavaScript中,可以使用Set来实现快速查找。

let data = new Set(['Alice', 'Bob', 'Charlie', 'David']);
console.log(data.has('Alice')); // true

四、使用Map

Map是一种新的数据类型,可以用来存储键值对。在JavaScript中,可以使用Map来实现快速查找。

let data = new Map([['Alice', 25],['Bob', 30],['Charlie', 35],['David', 40]
]);console.log(data.get('Alice')); // 25

参考

  1. ReqBin is an online API testing tool for REST and SOAP APIs
  2. 【干货】Chrome插件(扩展)开发全攻略
  3. JS复制到剪贴板的实现方法_笔记大全_设计学院
  4. 详解Javascript中document.execCommand()的用法
  5. js怎么样查找比较快-阿楠教学网
  6. Making a GET request with JavaScript
  7. Fetch API - Web API 接口参考 | MDN
  8. Sending POST Request in JavaScript

相关文章:

Chrome扩展程序开发随记

在Chrome浏览器向正被浏览的外网网页植入自定义JS脚本 为了实现如标题的目的&#xff0c;需要开发一个Chrome扩展程序。接下来内容是实现简要步骤&#xff1a; 一、新建文件夹&#xff0c;命名为项目名&#xff0c;如“MyPlugin”。 二、进入文件夹内&#xff0c;新建名为“…...

使用命令行快速创建Vite项目

一、构建项目 在终端中使用如下命令行&#xff1a; npm create vite 二、定义项目名称 三、选择项目类型 Vanilla是我们常用的JavaScript&#xff0c;Vue和React是常用前端框架&#xff0c;可以根据自己的需要进行选择 通过上下键进行选择&#xff0c;按下回车进行确认 创建…...

int *a, int **a, int a[], int *a[]的区别

int *a; ---定义一个指向整型变量的指针a int **a; ---定义一个指向整型变量指针的指针a int a[]; ---定义一个整型变量数组a int *a[]; ---定义一个指向整型变量指针的数组a...

leetcode100----双指针

283. 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1:输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2:输入: nums …...

ORM基本操作

ORM基本操作 基本操作包括增删改查操作&#xff0c;即(CRUD操作) CRUD是指在做计算处理时的增加(Create)、读取查询(Read)、更新Update)和删除(Delete) ORM CRUD 核心-> 模型类管理器对象 每个继承自 models.Model 的模型类&#xff0c;都会有一个 objects 对象被同样继…...

c语言进阶部分详解(指针进阶2)

大家好&#xff01;我快马加鞭接着写出指针部分part2部分。第一部分见&#xff1a;c语言进阶部分详解&#xff08;指针进阶1&#xff09;_总之就是非常唔姆的博客-CSDN博客 指针初阶部分见&#xff1a;c语言进阶部分详解&#xff08;指针初阶&#xff09;_总之就是非常唔姆的博…...

Java基础(一)——Hello World,8种数据类型,键盘录入

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

JAVA学习笔记(IF判断结构)

/*** 学习JAVA单分支结构* 掷骰子游戏* 1.如果三个随机数的和大于15&#xff0c;则手气不错&#xff1b;* 2.如果三个随机数的和在10-15之间&#xff0c;手气一般&#xff1b;* 3.如果三个随机数的和1在0以下&#xff0c;手气不太好。*/public class TestIf01 {public static v…...

【跟小嘉学 PHP 程序设计】二、PHP 基本语法

系列文章目录 【跟小嘉学 PHP 程序设计】一、PHP 开发环境搭建 【跟小嘉学 PHP 程序设计】二、PHP 基本语法 文章目录 系列文章目录@[TOC](文章目录)前言一、PHP基本语法1.1、hello,world1.2、PHP语法的其他形式1.2.1、简短形式(了解即可)1.2.2、Script 风格1.2.3、ASP 风格1…...

面试总结之微服务篇

一、概览 1、微服务常用组件 微服务给系统开发带来了诸多问题和挑战&#xff0c;如服务间通信和调用的复杂性、数据一致性和事务管理、服务治理和版本管理等&#xff0c;为解决应对这些问题和挑战&#xff0c;各种微服务组件应运而生微服务的常见组件和实现&#xff1a; 1…...

ElementUI之登陆+注册

一.什么是ElementUI 二.ElementUI完成用户注册登录界面搭建 使用命令npm install element-ui -S&#xff0c;添加Element-UI模块 导依赖 建立登录和注册页面 ​编辑 配置样式 编写登录页面&#xff08;Login&#xff09; 编写注册页面&#xff08;reginter&#xff09; …...

新版kafka可视化界面组件

二、安装kafka可视化客户端工具&#xff08;kafka tool 2&#xff09; 1、下载安装 在官网中找到对应自己电脑系统的版本&#xff1a; kafka Tool2官网下载地址&#xff1a; Offset Explorer 这个方案是为Kafka依赖zookeeper提供的可视化解决方案。 前言 在早期使用kafka的…...

​P1102 A-B 数对 【双指针(尺取法)】​

P1102 A-B 数对 【双指针&#xff08;尺取法&#xff09;】 题目描述 给出一串正整数数列以及一个正整数 C&#xff0c;要求计算出所有满足 A−BC 的数对的个数&#xff08;不同位置的数字一样的数对算不同的数对&#xff09;。 输入格式 输入共两行。 第一行&#xff0c;两个…...

Flutter绘制拖尾效果

演示&#xff1a; 代码&#xff1a; import dart:ui;import package:flutter/material.dart; import package:kq_flutter_widgets/widgets/chart/ex/extension.dart;class TrailingView extends StatelessWidget {const TrailingView({super.key});overrideWidget build(Build…...

【Newman+Jenkins】实施接口自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子&#xff0c;哈哈&#xff0c;开玩笑啦。。。别当真&#xff0c;简单地说Newman就是命令行版的Postman&#xff0c;查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行&#xff0c;把Postman界面化运…...

kr 第三阶段(六)C++ 逆向

结构体 结构体对齐 设置结构体对齐值 方法1&#xff1a;在 Visual Studio 中可以在 项目属性 -> 配置属性 -> C/C -> 所有选项 -> 结构体成员对齐 中设置结构体对齐大小。方法2&#xff1a;使用 #pragma pack(对齐值) 来设置&#xff0c;不过要想单独设置一个结…...

医药行业安全生产信息化建设分享

随着科技的快速发展和全球化进程的推进&#xff0c;医药行业作为人类健康和安全的重要组成部分&#xff0c;面临着日益严峻的安全生产挑战。近年来&#xff0c;医药企业对于安全生产的需求越来越强烈&#xff0c;安全生产信息化建设成为了医药行业发展的重要趋势。本文将探讨医…...

C 语言简单入门

C 语言发展历史|标准 1972年&#xff0c;丹尼斯里奇&#xff08;Dennis Ritch&#xff09;和肯汤普逊&#xff08;Ken Tompson&#xff09;在贝尔实验室开发 UNIX 操作系统时基于 B 语言设计出 C 语言。 1987年&#xff0c;布莱恩柯林汉&#xff08;Brian Kernighan&#xff…...

Levels - UE5中的建模相关

一些日常的笔记&#xff1b; 可以使用Shapes面板建立基础模型&#xff1a; 可以在PolyModel中继续细分模型&#xff1a; UE5中的建模有PolyGroups概念&#xff0c;可以在Attributes面板中直接编辑&#xff1a; 使用GrpPnt方式可以直接用笔刷设定新的PolyGroups&#xff0c;这样…...

数据中心与数据仓库的区别

在数字化时代&#xff0c;数据已经成为企业竞争的核心资源&#xff0c;数据处理和数据管理也变得越来越重要。在数据处理方面&#xff0c;数据中台和数据仓库是两种常见的数据处理方式&#xff0c;它们有着不同的特点和适用场景。本文将从技术角度对数据中台和数据仓库的区别进…...

ERNIE-4.5-0.3B-PT企业落地场景:基于vLLM的轻量级智能问答助手搭建

ERNIE-4.5-0.3B-PT企业落地场景&#xff1a;基于vLLM的轻量级智能问答助手搭建 1. 项目概述与价值 智能问答助手已经成为企业提升服务效率和用户体验的重要工具。传统方案往往面临部署复杂、资源消耗大、响应速度慢等问题。今天介绍的基于vLLM部署的ERNIE-4.5-0.3B-PT模型&am…...

OFA-Image-Caption模型解析:从卷积神经网络到跨模态理解的架构揭秘

OFA-Image-Caption模型解析&#xff1a;从卷积神经网络到跨模态理解的架构揭秘 最近几年&#xff0c;AI在“看图说话”这件事上进步飞快。你可能见过一些工具&#xff0c;上传一张照片&#xff0c;它就能自动生成一段描述。这背后&#xff0c;图像描述生成技术是关键。今天咱们…...

从零构建:麦克纳姆轮底盘的运动学模型与O-长方形布局解析

1. 麦克纳姆轮基础原理与结构解析 第一次接触麦克纳姆轮时&#xff0c;我被它那酷似"风火轮"的外观吸引了。这种特殊设计的轮子由瑞典工程师Bengt Ilon在1973年发明&#xff0c;如今已成为移动机器人领域的明星组件。让我带你从最基础的物理结构开始&#xff0c;逐步…...

告别重复输入密码!手把手教你为GitLab配置SSH密钥(Windows/Mac通用)

告别重复输入密码&#xff01;手把手教你为GitLab配置SSH密钥&#xff08;Windows/Mac通用&#xff09; 每次提交代码都要输入密码&#xff1f;GitLab频繁的身份验证是否让你感到烦躁&#xff1f;作为开发者&#xff0c;我们每天要与版本控制系统打交道数十次&#xff0c;重复的…...

从经典控制器到前沿控制的发展

目录 前言 一、PID控制 1.数字PID 2.PID参数的优化 1.微分项的问题 2.积分项的问题 3.PID参数整定法 3.PID参数对系统性能指标的影响 二、模糊控制 1.模糊控制的五大核心步骤 1.模糊化 2.建立模糊规控制规则 3.模糊推理与解模糊 2.模糊PID 1.直接型模糊PID 2.增…...

Highlight.js在Vue3中的性能优化指南:按需加载 vs 全量引入

Highlight.js在Vue3中的性能优化实战&#xff1a;从全量引入到精准加载 当你的Vue3项目需要展示代码片段时&#xff0c;Highlight.js无疑是语法高亮的首选方案。但在大型应用中&#xff0c;直接全量引入这个强大的工具可能会让你的打包体积意外膨胀——完整的Highlight.js包含超…...

MogFace人脸检测工具实测:16GB显存下支持最高4096×2160分辨率单图检测

MogFace人脸检测工具实测&#xff1a;16GB显存下支持最高40962160分辨率单图检测 1. 引言&#xff1a;当高清图片遇上精准人脸检测 你有没有遇到过这样的场景&#xff1f;拿到一张几千人合影的高清大图&#xff0c;想快速找出某个特定人物&#xff0c;或者需要从监控录像的4K…...

5分钟本地部署Asian Beauty Z-Image Turbo:零基础生成东方美学人像写真

5分钟本地部署Asian Beauty Z-Image Turbo&#xff1a;零基础生成东方美学人像写真 在数字内容创作蓬勃发展的今天&#xff0c;高质量人像图像的需求与日俱增。特别是对于东方审美风格的人像写真&#xff0c;传统拍摄方式成本高昂且效率低下。今天&#xff0c;我将带你快速部署…...

S2-Pro跨语言编程能力评测:根据中文注释生成多国语言代码

S2-Pro跨语言编程能力评测&#xff1a;根据中文注释生成多国语言代码 1. 评测背景与目标 在软件开发领域&#xff0c;跨语言编程能力正变得越来越重要。开发者经常需要在不同技术栈间切换&#xff0c;或者将一个语言的算法实现迁移到另一个语言。传统方式下&#xff0c;这需要…...

2026年04月05日最热门的开源项目(Github)

在本期榜单中&#xff0c;有多个项目得到了较高的关注和热度&#xff0c;以下是对这些项目的一些分析&#xff1a; 总体趋势&#xff1a; 本期榜单主要集中在与人工智能&#xff08;AI&#xff09;、代码生成和代理系统相关的项目上。很多项目致力于提高代码效率、优化开发流程…...