创建 Edge 浏览器扩展教程(下)

news2024/9/27 9:03:27

创建 Edge 浏览器扩展教程(下)

    • 创建扩展教程,第 2 部分
      • 1:更新弹出窗口.html以包含按钮
      • 2:更新弹出窗口.html在浏览器选项卡顶部显示图像
      • 3:创建弹出式 JavaScript 以发送消息
      • 4:从任何浏览器选项卡提供您的服务
      • 5:更新您的清单文件和Web访问权限
      • 6:添加内容脚本的消息监听器

创建扩展教程,第 2 部分

在本文中,我们将继续通过添加一个按钮来更新弹出窗口.html文件,并在浏览器选项卡的顶部显示一个图像。
官方教程连接:https://learn.microsoft.com/en-us/microsoft-edge/extensions-chromium/getting-started/part2-content-scripts?tabs=v3

1:更新弹出窗口.html以包含按钮

首先,在之前创建的弹出文件夹中的popup.html文件中,我们将添加包含按钮的标题。我们还将在稍后的步骤中对该按钮进行编程,但现在首先包含对空的JavaScript文件的引用。

以下是一个更新后的HTML文件示例:

<html>
<head>
    <meta charset="utf-8" />
    <style>
        body {
            width: 500px;
        }
        button {
            background-color: #336dab;
            border: none;
            color: white;
            padding: 15px 32px;
            text-align: center;
            font-size: 16px;
        }
    </style>
</head>
<body>
    <h1>Display the NASA picture of the day</h1>
    <h2>(select the image to remove)</h2>
    <button id="sendmessageid">Display</button>
    <script src="popup.js"></script>
</body>
</html>

完成后,更新并打开扩展程序,您将看到一个弹出窗口,其中包含一个显示按钮。
图示

2:更新弹出窗口.html在浏览器选项卡顶部显示图像

在添加按钮后,下一个任务是使其在活动选项卡页面的顶部显示图像文件(images/stars.jpeg)。

每个选项卡页面(和扩展)都在自己的线程中运行。我们需要创建一个内容脚本将注入到选项卡页面中。然后,我们可以将消息从弹出窗口发送到运行在选项卡页面上的内容脚本。内容脚本将收到该消息,并描述应该显示哪个图像。

3:创建弹出式 JavaScript 以发送消息

我们将创建一个文件并添加代码,以向尚未创建的内容脚本发送消息。要立即创建该消息并将其注入到浏览器选项卡中,以下代码将在弹出的“显示”按钮上添加一个事件:

const sendMessageId = document.getElementById("sendmessageid");
if (sendMessageId) {
  sendMessageId.onclick = function() {
    // do something
  };
}

在这种情况下,我们首先需要找到当前的浏览器选项卡。然后,我们可以使用扩展API向该选项卡发送消息。在onclick事件中,我们使用chrome.tabs.query方法来查询当前选项卡,并使用chrome.tabs.sendMessage方法发送消息。

在发送的消息中,我们需要包含要显示的图像的URL。还请确保为要插入图像的div分配一个唯一的ID。

为了生成唯一的ID,我们可以使用不同的方法:

  • 方法1:让内容脚本生成该图像的ID。我们将在稍后的教程中介绍这种方法。
  • 方法2:在弹出窗口中生成该唯一ID,然后将其传递给尚未创建的内容脚本。我们将在本教程中使用此方法。

下面是上述代码的更新版本。我们还将传递当前选项卡的ID,以备稍后使用:

const sendMessageId = document.getElementById("sendmessageid");
if (sendMessageId) {
    sendMessageId.onclick = function() {
        chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {
            chrome.tabs.sendMessage(
                tabs[0].id,
                {
                    url: chrome.runtime.getURL("images/stars.jpeg"),
                    imageDivId: `${guidGenerator()}`,
                    tabId: tabs[0].id
                },
                function(response) {
                    window.close();
                }
            );
            function guidGenerator() {
                const S4 = function () {
                    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
                };
                return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
            }
        });
    };
}

以上是第2部分的步骤。完成以上步骤后,您将更新弹出窗口.html以包含一个按钮,并且通过点击该按钮,可以将图像显示在浏览器选项卡的顶部。

要查看本教程此部分的完整扩展包源代码,请转到 MicrosoftEdge-Extensions 存储库> 扩展获取-开始-part-part2。

请注意,源代码已从清单V2更新到清单V3。

在下一部分教程中,我们将继续介绍如何注入JavaScript库到扩展中,并将内容页添加到现有的浏览器选项卡中。

4:从任何浏览器选项卡提供您的服务

要从任何浏览器选项卡提供服务,您需要使用API chrome.runtime.getURL('images/stars.jpeg')

如果您使用的是清单V2,请改用 .getURL。由于附加的图像返回一个额外的前缀,所以您需要使用以下代码来获取图像的URL:chrome.extension.getURL('images/stars.jpeg')

您需要将静态图像文件公开为Web资源,以便可以在内容页面中使用。您可以通过在清单文件中添加以下条目来声明图像可以在所有浏览器选项卡中使用:

"web_accessible_resources": [
    {
      "resources": ["images/*.jpeg"],
      "matches": ["<all_urls>"]
    }
  ]

现在,您已经为注入到选项卡中的内容页面编写了代码,但是您还没有创建和注入该内容页面。接下来,我们来完成这一步骤。

5:更新您的清单文件和Web访问权限

更新您的清单文件如下所示:

{
    "name": "NASA picture of the day viewer",
    "version": "0.0.0.1",
    "manifest_version": 3,
    "description": "An extension to display the NASA picture of the day.",
    "icons": {
        "16": "icons/nasapod16x16.png",
        "32": "icons/nasapod32x32.png",
        "48": "icons/nasapod48x48.png",
        "128": "icons/nasapod128x128.png"
    },
    "action": {
        "default_popup": "popup/popup.html"
    },
    "content_scripts": [
        {
            "matches": [
              "<all_urls>"
            ],
            "js": ["lib/jquery.min.js","content-scripts/content.js"]
        }
    ],
    "web_accessible_resources": [
        {
            "resources": ["images/*.jpeg"],
            "matches": ["<all_urls>"]
        }
    ]
}

在清单文件中,您添加了内容脚本和可访问的资源条目。内容脚本将在所有浏览器选项卡页上运行,并注入所需的JavaScript和CSS文件。可访问的资源条目允许静态图像文件在浏览器选项卡页上使用。

在要注入的内容脚本中,您计划使用jQuery。您可以将jQuery的缩小版本添加为lib/jquery.min.js文件,并将其列为内容脚本中的JavaScript文件。

请注意,注入的内容脚本和页面加载的脚本运行在不同的线程上。注入的JavaScript无法访问页面中运行的脚本。所以,在内容脚本中注入的代码只能操作在浏览器选项卡中加载的DOM。

6:添加内容脚本的消息监听器

在内容脚本中添加一个消息监听器,用于处理来自弹出菜单的消息:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    $("body").prepend(
        `<img src="${request.url}" id="${request.imageDivId}" class="slide-image" /> `
    );
    $("head").prepend(
        `<style>
            .slide-image {
                height: auto;
                width: 100vw;
            }
        </style>`
    );
    $(`#${request.imageDivId}`).click(function() {
        $(`#${request.imageDivId}`).remove(`#${request.imageDivId}`);
    });
    sendResponse({ fromcontent: "This message is from content.js" });
});

在上面的代码中,添加的监听器函数使用jQuery在浏览器选项卡页上添加了一个图像元素。同时,它也添加了一个样式表,以使该图像元素覆盖整个页面。然后,它为图像元素添加了一个点击事件侦听器,以便在用户点击图像时将其删除。

这样,我们成功创建了一个扩展,该扩展可以通过弹出窗口发送消息,并在浏览器选项卡页上显示一个具有动态插入的图像的内容。

当您选择该按钮时,您将获得以下内容。如果选择图像上的任意位置,则会删除该图像元素,选项卡页面将折叠回最初显示的内容:Displaystars.jpeg

图示

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python爬虫分析基于python图书馆书目推荐数据分析与可视化

收藏关注不迷路 文章目录 前言一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、文章目录 前言 随着电子技术的普及和快速发展&#xff0c;线上管理系统被广泛的使用&#xff0c;有很多商业机构都在实现电子信息化管理&#xff0c;图书推荐也不例外&#xff0c…

AI智能监控平台EasyCVR+无人机方案:实时全景无死角全方面助力山区安防系统新升级

无人机作为高速发展的高科技设备&#xff0c;技术日趋成熟&#xff0c;目前已经被广泛应用于农业、森林防护、医疗、交通物流等等场景。但随着城市化进程的加快&#xff0c;人类对自然环境日益严重的破坏&#xff0c;近十几年来&#xff0c;森林火灾的发生频率和失火严重程度一…

设计模式(12)状态模式

参考【设计模式】用Java实现状态模式_java 状态模式_卷帘的博客-CSDN博客 一、介绍&#xff1a; 1、状态模式&#xff1a;是一种行为设计模式&#xff0c;它允许对象在内部状态发生改变时改变其行为。该模式将对象的行为包装在不同的状态类中&#xff0c;使得对象的行为可以根…

Node编写重置用户密码接口

目录 前言 定义路由和处理函数 验证表单数据 实现重置密码功能 前言 接前面文章&#xff0c;本文介绍如何编写重置用户密码接口 定义路由和处理函数 路由 // 重置密码的路由 router.post(/updatepwd, userinfo_handler.updatePassword) 处理函数 exports.updatePasswo…

python造测试数据存到excel

代码&#xff1a; from ExcelHandler import ExcelHandler from faker import Faker # 导入faker库的Faker方法 # ↓默认为en_US&#xff0c;只有使用了相关语言才能生成相对应的随机数据 fkFaker(locale"zh_CN")def create_date():m int(input(请输入要造的数据条…

Zabbix“专家坐诊”第208期问答汇总

问题一 Q&#xff1a;请问大佬们&#xff0c;我的测试机部署了2个版本的zabbix服务端&#xff0c;在启动第二个的时候报这个错&#xff0c;请问这个路径能在配置文件修改吗&#xff1f; SYJKLiLB64dded94d3c0c.png A&#xff1a;报错是你的进程存在&#xff0c;无法启动。一个…

【深蓝学院】手写VIO第8章--相机与IMU时间戳同步--笔记

0. 内容 1. 时间戳同步问题及意义 时间戳同步的原因&#xff1a;如果不同步&#xff0c;由于IMU频率高&#xff0c;可能由于时间戳不同步而导致在两帧camera之间的时间内用多了或者用少了IMU的数据&#xff0c;且时间不同步会导致我们首尾camera和IMU数据时间不同&#xff0c;…

docker和K8S环境xxl-job定时任务不执行问题总结

文章目录 xxl-job 任务调度原理1 问题1 时区导致的任务没有执行的问题解决方案 2 执行器注册和下线导致的问题&#xff08;IP问题&#xff09;解决方案 3 问题3 调度成功&#xff0c;但是执行器的定时任务未执行4 问题4 数据库性能问题&#xff0c;导致查询任务和操作日志数据卡…

I/O 模型学习笔记【全面理解BIO/NIO/AIO】

文章目录 I/O 模型什么是 I/O 模型Java支持3种I/O模型BIO&#xff08;Blocking I/O&#xff09;NIO&#xff08;Non-blocking I/O&#xff09;AIO&#xff08;Asynchronous I/O&#xff09; BIO、NIO、AIO适用场景分析 java BIOJava BIO 基本介绍Java BIO 编程流程一个栗子实现…

Unity使用c#开发apk项目(十九)(Failed to find entry-points:System.Exception: )

文章目录 前言解决方案:1.报警信息如下2.选择3d urp3.引入Fusion之后选择包管理,点击Burst中的Advanced Project Settings4.勾选两个预设选项5.引入官网unity.burst6.更新后报警消失前言 制作局域网游戏,出现未找到进入点报警 Failed to find entry-points 解决方案: 1.报…

二十二、设计模式之访问者模式

目录 二十二、设计模式之访问者模式能帮我们干什么&#xff1f;主要解决什么问题&#xff1f;特点 优缺点优点缺点&#xff1a; 使用的场景角色实现访问者模式 总结 二十二、设计模式之访问者模式 所属类型定义行为型表示一个作用于某对象结构中的各元素的操作。它使你可以在不…

【学习笔记】Git开发流程

Git开发大致流程图&#xff1a; 具体流程&#xff1a; 首先一个从仓库的main分支&#xff0c;然后从main分支中拉一个功能分支feature/xxx&#xff0c;在多人开发这个功能的时候拉去自己的个人分支比如&#xff1a;xxx/xxx 。然后每天开发完个人分支后压缩commit&#xff0c;…

flask连接sqllite,并进行一些基本的增删改查操作

flask连接sqllite&#xff0c;并进行一些基本的增删改查操作 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流…

docker部署prometheus+grafana服务器监控(三) - 配置grafana

查看 prometheus 访问 http://ip:9090/targets&#xff0c;效果如下&#xff0c;上面我们通过 node_exporter 收集的节点状态是 up 状态。 配置 Grafana 访问 http://ip:3000&#xff0c;登录 Grafana&#xff0c;默认的账号密码是 admin:admin&#xff0c;首次登录需要修改…

【STM32】HAL库ADC多通道精准测量(采用VREFINT内部参考电压)

【STM32】HAL库ADC多通道精准测量&#xff08;采用VREFINT内部参考电压&#xff09; 文章目录 多通道测量VREFINTADC采样周期多通道配置 附录&#xff1a;Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作…

如何在Android Termux上安装MySQL并实现公网远程访问?

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

Django 地址接口开发

应用 Mixin 混合类进行收货地址接口开发 python ../manage.py startapp address继承了mixins扩展类&#xff0c;进到里面可以稍微看下源码 该方法帮我们实现了获取验证及保存的功能 address/views from rest_framework.generics import GenericAPIView from rest_framewo…

北大提出RestGPT框架,通过RESTful API控制真实应用的Agent

©PaperWeekly 原创 作者 | 宋一帆 单位 | 北京大学计算语言学研究所博士生 研究方向 | 自然语言处理 论文题目&#xff1a; RestGPT: Connecting Large Language Models with Real-World RESTful APIs 论文链接&#xff1a; https://arxiv.org/abs/2306.06624 代码链接&a…

【哈希数组】【字符串 转化为 字符数组】Leetcode 383 赎金信

【哈希表】【字符串 转化为 字符数组】Leetcode 383 赎金信 解法1 【哈希数组】 String 转化为 字符数组char[ ] .toCharArray ⭐️String 转化为 字符数组char[ ] .toCharArray 解法1 【哈希数组】 String 转化为 字符数组char[ ] .toCharArray 时间复杂度O(N) 这个解决方案…

自学(黑客技术)方法——网络安全

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…