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

创建 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.mfbz.cn/a/103871.html

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

相关文章

react createElement 和 cloneElement 有什么区别?

前言 什么是react React是一个用于构建用户界面的JavaScript库。它旨在帮助开发人员构建可维护、高性能的应用程序界面。React的核心思想是组件化&#xff0c;它允许开发人员将用户界面划分为小块组件&#xff0c;每个组件负责自己的渲染和行为。这种组件化的方法使得代码更容易…

k8s集群镜像下载加gradana监控加elk日志收集加devops加秒杀项目

展示 1.配套资料2.devops 3.elk日志收集 4.grafana监控 5.dashboard![在这里插入图片描述](https://img-blog.csdnimg.cn/bf294f9fd98e4c038858a6bf5c34dbdc.png 目的 学习k8s来来回回折腾很久了&#xff0c;光搭个环境就能折腾几天。这次工作需要终于静下心来好好学习了一…

经管博士科研基础【26】海塞矩阵

1. 海塞矩阵 海塞矩阵是一个由多变量实值函数的所有二阶偏导数组成的方块矩阵。 一元函数就是二阶导,多元函数就是二阶偏导组成的矩阵。求向量函数最小值时可以使用,矩阵正定是最小值存在的充分条件。经济学中常常遇到求最优的问题,目标函数是多元非线性函数的极值问题,尚…

Warning: ‘Destination Folder‘ contains 1 space.【Anaconda安装】

报错内容如下&#xff1a; 意思就是说你的安装路径下不要有空格哈哈&#xff0c;有空格就不行&#xff0c;比如&#xff1a; "D:\Program Files\Anaconda3"中间就有空格&#xff0c;Program与Files之间。 换个路径&#xff0c;例如&#xff1a; 就可以了。

【技能树笔记】网络篇——练习题解析(九)

目录 前言 一、OSPF双栈 1.1 OSPFv3 LSA 1.2 OSPFv3 二、ISIS双栈 2.1 ISISv6 2.2 ISIS高级特性 三、BGP双栈 四、PIM双栈 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filot…

python—openpyxl操作excel详解

前言 openpyxl属于第三方模块&#xff0c;在python中用来处理excel文件。 可以对excel进行的操作有&#xff1a;读写、修改、调整样式及插入图片等。 但只能用来处理【 .xlsx】 后缀的excel文件。 使用前需要先安装&#xff0c;安装方法&#xff1a; pip install openpyxl…

Hadoop3教程(二十七):(生产调优篇)HDFS读写压测

文章目录 &#xff08;146&#xff09;HDFS压测环境准备&#xff08;147&#xff09;HDFS读写压测写压测读压测 参考文献 &#xff08;146&#xff09;HDFS压测环境准备 对开发人员来讲&#xff0c;压测这个技能很重要。 假设你刚搭建好一个集群&#xff0c;就可以直接投入生…

华为数通方向HCIP-DataCom H12-831题库(多选题:61-80)

第61题 在MPLS VPN中,为了区分使用相同地址空间的IPV4前缀,将IPV4的地址增加了RD值,下列选项描述正确的是: A、在PE设备上,每一个VPN实例都对应一个RD值,同一PE设备上,必须保证RD值唯一 B、RD可用于来控制VPN路由信息的发布 C、RD在传递过程中作为BGP的扩展团体性封装在…

Docker镜像仓库

Docker镜像仓库 一、Docker镜像的创建1.1、基于已有镜像创建1.2、基于本地模板创建1.3、基于Dockerfile创建&#xff08;使用最广泛&#xff09;1.3.1、联合文件系统&#xff08;UnionFS&#xff09;1.3.2、镜像加载原理1.3.3、Dockerfile1.3.4、Docker 镜像结构的分层 二、如何…

【JavaScript】深入浅出理解事件循环

1. 浏览器的进程模型 1.1 进程 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程。 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 1.2 线程 有了进程后&#xff0c;就可以运…

uniapp: 本应用使用HBuilderX x.x.xx 或对应的cli版本编译,而手机端SDK版本是 x.x.xx。不匹配的版本可能造成应用异常。

文章目录 前言一、原因分析二、解决方案2.1、方案一&#xff1a;更新HbuilderX版本2.2、方案二&#xff1a;设置固定的版本2.3、方案三&#xff1a;忽略版本&#xff08;不推荐&#xff09; 三、总结四、感谢 前言 项目场景&#xff1a;示例&#xff1a;通过使用HbuilderX打包…

idea 设置serlvet 类模板(快捷生成servlet类)

我的版本是idea2020.3.4&#xff0c;博客中有相应安装教程&#xff0c;其他版本设置类似&#xff1a; 1.选择文件-->设置 2.选择编辑器-->文件和代码模板-->其他 3.选择Web-->Servlet Annotated Class.java-->复制相应模板&#xff0c;下面顺便设置了注释模板 …

成集云 | 成销云-移动订货集成用友NC | 解决方案

方案介绍 成销云移动订货系统支持多终端下单、业务员代下单、分级定价、数据分析、财务结算、对接ERP等功能&#xff0c;帮助客户解决、订货困难、错单漏单、价格体系混乱等问题&#xff0c;为商家提供更精准的营销和库存管理手段。 用友NC是用友NC产品的全新系列&#xff0c…

【JAVA学习笔记】44 - 注解,元注解

项目代码 一、注解的引入 1)注解(Annotation)也被称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。 2)和注释一样&#xff0c;注解不影响程序逻辑&#xff0c;但注解可以被编译或运行&#xff0c;相当于嵌入在代码中的补充信息。 3)在Ja…

GLIP,FLIP论文阅读

Scaling Language-Image Pre-training via Masking&#xff08;FLIP&#xff0c;2023&#xff09;&#x1f44d; 贡献&#xff1a; 1.图像端引入MAE的随机MASK&#xff0c;image encoder只处理未mask的patches&#xff08;和之前的MAE方法一致&#xff09;&#xff0c;减少了输…

一、python基础语法

文章目录 1.Python介绍1&#xff09;发明者龟叔2&#xff09;python特点3&#xff09;python缺点4&#xff09;Python版本 2.Python解释器1&#xff09;编译型和解释型2&#xff09;常见的python解释器3&#xff09;下载Python解释器4&#xff09;安装Python解释器5&#xff09…

网络流探索:解决网络最大流问题的算法集锦

1.初识网络流 网络流一直是初学者心中很难过去的一道坎&#xff0c;很多人说它是一个不像DFS/BFS那么直观的算法&#xff0c;同时网上也有各种参差不齐的材料&#xff0c;让人感到一知半解。 如果你也有这样的感觉&#xff0c;那么不要灰心&#xff0c;坚持住&#xff0c;因为…

redis 主从复制

1 . redis主从复制 – 配置文件方式实现 1.1简介 : 主机更新后根据配置和策略&#xff0c;自动同步到备机的master/slave机制&#xff0c;Master以写为主&#xff0c;Slave以读为主 1.2 具体作用 读写分离&#xff0c;性能扩展&#xff0c;降低主服务器的压力容灾&#xff0c…

对比Vue2和Vue3的自定义指令

一、自定义指令简介 自定义指令是Vue提供的能力,用于注册自定义的指令,从而实现一些自定义的DOM操作。 二、Vue2中自定义指令 在Vue2中,自定义指令通过全局方法Vue.directive()进行注册: // 注册全局指令v-focus Vue.directive(focus, {inserted: function(el) {el.focus()…

mysql 命令行安装

一、安装包下载 1、下载压缩包 &#xff08;1&#xff09;公众号获取 关注微信公众号【I am Walker】&#xff0c;回复“mysql”获取 &#xff08;2&#xff09;官网下载 安装地址MySQL :: Download MySQL Community Server ​ ​ 二、解压 下载完之后进行解压&…
最新文章