google 浏览器插件开发简单学习案例:计算器

1、首先,我们需要创建扩展的文件结构
在这里插入图片描述
在这里插入图片描述

2、创建 manifest.json 文件
是Chrome插件的配置文件,定义了插件的基本信息和资源。

{"manifest_version": 3,"name": "Simple Calculator","version": "1.0","description": "A simple calculator extension for Chrome","action": {"default_popup": "popup.html","default_icon": {"16": "images/calculator-16.png","48": "images/calculator-48.png","128": "images/calculator-128.png"}},"icons": {"16": "images/calculator-16.png","48": "images/calculator-48.png","128": "images/calculator-128.png"}
}

3、创建 popup.html 文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Calculator</title><style>body {width: 230px;font-family: Arial, sans-serif;background-color: #f0f0f0;margin: 0;padding: 10px;}#calculator {background-color: #333;border-radius: 5px;padding: 10px;}#display {width: 100%;height: 40px;margin-bottom: 10px;font-size: 20px;text-align: right;background-color: #eee;border: none;border-radius: 3px;}.buttons {display: grid;grid-template-columns: repeat(4, 1fr);gap: 5px;}button {width: 100%;height: 40px;font-size: 18px;border: none;border-radius: 3px;cursor: pointer;background-color: #4CAF50;color: white;}button:hover {background-color: #45a049;}.operator {background-color: #ff9800;}.operator:hover {background-color: #e68a00;}#clear {background-color: #f44336;}#clear:hover {background-color: #da190b;}</style>
</head>
<body><div id="calculator"><input type="text" id="display" readonly><div class="buttons"><button id="clear">C</button><button class="operator">÷</button><button class="operator">×</button><button class="operator">-</button><button>7</button><button>8</button><button>9</button><button class="operator">+</button><button>4</button><button>5</button><button>6</button><button id="equals">=</button><button>1</button><button>2</button><button>3</button><button>0</button><button>.</button></div></div><script src="popup.js"></script>
</body>
</html>

4、创建 popup.js 文件以实现计算器的功能

document.addEventListener('DOMContentLoaded', function() {const display = document.getElementById('display');const buttons = document.querySelectorAll('button');let currentValue = '';let operator = '';let previousValue = '';buttons.forEach(button => {button.addEventListener('click', function() {const value = this.textContent;if (value >= '0' && value <= '9' || value === '.') {currentValue += value;display.value = currentValue;} else if (value === 'C') {currentValue = '';operator = '';previousValue = '';display.value = '';} else if (value === '=') {if (previousValue && operator && currentValue) {currentValue = operate(parseFloat(previousValue), parseFloat(currentValue), operator);display.value = currentValue;previousValue = '';operator = '';}} else {if (currentValue) {if (previousValue && operator) {previousValue = operate(parseFloat(previousValue), parseFloat(currentValue), operator);} else {previousValue = currentValue;}currentValue = '';operator = value;display.value = previousValue;}}});});function operate(a, b, op) {switch(op) {case '+': return a + b;case '-': return a - b;case '×': return a * b;case '÷': return b !== 0 ? a / b : 'Error';default: return b;}}
});

5、创建images文件夹
里面存放插件应用的图标,三个不同尺寸的图标文件,比如16是指16x16 像素
在这里插入图片描述

6、google浏览器加载使用

打开Chrome浏览器,进入 chrome://extensions/
开启右上角的"开发者模式"
点击"加载已解压的扩展程序"
选择包含这些文件的文件夹

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把imges文件夹下的图片按要求更改尺寸后图标显示正常:

在这里插入图片描述

7、上架插件

如何提交审核上架 Chrome 扩展

  1. 准备工作

    • 确保您的扩展完全按预期工作。
    • 准备一个简短的描述和详细的描述。
    • 准备至少一张截图(1280x800 或 640x400 像素)。
    • 准备一个 128x128 像素的高质量图标。
    • 如果适用,准备一个宣传图片(440x280 像素)。
    • 准备隐私政策(如果您的扩展收集用户数据)。
  2. 创建开发者账户

    • 访问 Chrome Web Store 开发者控制台。
    • 支付一次性的 $5 注册费。
  3. 创建新项目

    • 在开发者控制台中,点击 “New item”(新建项目)。
  4. 上传您的扩展

    • 将您的扩展文件打包成一个 ZIP 文件。
    • 在表单中上传这个 ZIP 文件。
  5. 填写商店列表信息

    • 输入扩展名称、简短描述和详细描述。
    • 上传图标和截图。
    • 选择适当的类别。
    • 设置语言和目标国家/地区。
  6. 隐私和权限

    • 如果适用,提供隐私政策 URL。
    • 确认您遵守了开发者计划政策。
  7. 支付和分发

    • 选择您的扩展是免费还是付费。
    • 选择发布到公开还是私有。
  8. 提交审核

    • 检查所有信息无误后,点击 “Submit for review”(提交审核)。
  9. 等待审核

    • Google 通常会在几天内完成审核。
    • 如果有问题,他们会通过电子邮件联系您。
  10. 发布

    • 一旦审核通过,您的扩展就会在 Chrome Web Store 上发布。
      在这里插入图片描述

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

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

相关文章

[K8S]一、Flink on K8S

Kubernetes | Apache Flink 先编辑好这5个配置文件&#xff0c;然后再直接执行 kubectl create -f ./ kubectl get all kubectl get nodes kubectl get pods kubectl get pod -o wide kubectl get cm -- 获取所有的configmap 配置文件 kubectl logs pod_name -- 查看…

链接追踪系列-00.es设置日志保存7天-番外篇

索引生命周期策略 ELK日志我们一般都是按天存储&#xff0c;例如索引名为"zipkin-span-2023-03-24"&#xff0c;因为日志量所占的存储是非常大的&#xff0c;我们不能一直保存&#xff0c;而是要定期清理旧的&#xff0c;这里就以保留7天日志为例。 自动清理7天以前…

Java二十三种设计模式-工厂方法模式(2/23)

工厂方法模式&#xff1a;设计模式中的瑞士军刀 引言 在软件开发中&#xff0c;工厂方法模式是一种常用的创建型设计模式&#xff0c;它用于处理对象的创建&#xff0c;将对象的实例化推迟到子类中进行。这种模式不仅简化了对象的创建过程&#xff0c;还提高了代码的可维护性…

如何预防最新的baxia变种勒索病毒感染您的计算机?

引言 在当今数字化时代&#xff0c;网络安全威胁层出不穷&#xff0c;其中勒索病毒已成为企业和个人面临的重大挑战之一。近期&#xff0c;.baxia勒索病毒以其高隐蔽性和破坏性引起了广泛关注。本文将详细介绍.baxia勒索病毒的特点、传播方式&#xff0c;并给出相应的应对策略…

QT VTK 简单测试工程

目录 1 目录结构 2 文件源码 3 运行结果 4 报错及处理 使用编译好的VTK库进行测试 1 目录结构 2 文件源码 Pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. #…

今天我们来聊Java IO模型,BIO、NIO、AIO三种常见IO模型

一、写在开头 很久没更新喽&#xff0c;最近build哥一直在忙着工作&#xff0c;忙着写小说&#xff0c;都忘记学习自己的本职了&#xff0c;哈哈&#xff0c;不过现在正式回归&#xff01; 我们继续学习Java的IO相关内容&#xff0c;之前我们了解到&#xff0c;所谓的IO&#…

工作笔记 5 Post请求 密码加密器PasswordEncoder 小程序登录

1.微信小程序登录 1.1小程序登录流程图 1.2使用sa-token完成登录 参考csdn这位老哥的http://t.csdnimg.cn/oRgvI sa-token是一款轻量级的安全框架 1.2.1首先引入sa-token依赖 <dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring…

java日常开发中常用的集合工具类方法归总(java8 stream)

1、创建map集合的方式 方式1&#xff1a; Map<String, Object> map new HashMap<>(); map.put("a", "test"); map.put("b", "since"); 方式2&#xff1a; Map<String, Object> map2 new HashMap<>() {{…

【云原生】Prometheus整合Alertmanager告警规则使用详解

目录 一、前言 二、Altermanager概述 2.1 什么是Altermanager 2.2 Altermanager使用场景 三、Altermanager架构与原理 3.1 Altermanager使用步骤 3.2 Altermanager工作机制 3.3 Altermanager在Prometheus中的位置 四、Altermanager部署与接入Prometheus 4.1 Altermana…

ConfigMap-secrets-静态pod

一.ConfigMap 1.概述 ConfigMap资源&#xff0c;简称CM资源&#xff0c;它生成的键值对数据&#xff0c;存储在ETCD数据库中 应用场景&#xff1a;主要是对应用程序的配置 pod通过env变量引入ConfigMap&#xff0c;或者通过数据卷挂载volume的方式引入ConfigMap资源 官方解释…

UniVue@v1.4.0版本发布:运行时调试器RuntimeDebuger

GitHub仓库 发布版本仓库&#xff1a;https://github.com/Avalon712/UniVue 开发版本仓库&#xff1a;https://github.com/Avalon712/UniVue-Develop UniVue拓展框架UniVue源生成器仓库&#xff1a;https://github.com/Avalon712/UniVue-SourceGenerator 更新说明 在没有调…

【Python】Windows系统 pip 换源方法(永久 / 临时)

pip 换源 首先国内较好的镜像地址有&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple 豆瓣&#xff1a;http://pypi.douban.com/simple 腾讯&#xff1a;http://mirrors.cloud.tencent.com/…

Mysql数据表的约束(下)

3.默认值约束(default) 与非空约束的命令一致,因为都属于列级约束,因此只需将not null改为default 默认值即可 删除默认值约束: 4.主键约束(primary key) 表示给一张表格设置了一个唯一标识,为了更快的去通过唯一的数据去准确的查找到每一条记录,一半咱们在创建表…

【Linux】基于环形队列RingQueue的生产消费者模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 环形队列的概念及定义 POSIX信号量 RingQueue的实现方式 RingQueue.hpp的构建 Thread.hpp Main.cc主函数的编写 Task.hpp function包装器的使用 总结 前言…

关于Kafka Topic分区和Replication分配的策略

文章目录 1. Topic多分区2. 理想的策略3. 实际的策略4. 如何自定义策略 1. Topic多分区 如图&#xff0c;是一个多分区Topic在Kafka集群中可能得分配情况。 P0-RL代表分区0&#xff0c;Leader副本。 这个Topic是3分区2副本的配置。分区尽量均匀分在不同的Broker上&#xff0c…

第3章 创建最小(Minimal APIs)API应用程序

第1章 框架学习的基石与实战策略 第2章 大话ASP.NET Core 入门 第3章 创建最小&#xff08;Minimal APIs&#xff09;API应用程序 1.最小API概述 在ASP.NET Core的广阔天地里&#xff0c;"最小API应用程序"如同一把轻巧而强大的瑞士军刀&#xff0c;专为迅速构建…

idea中打开静态网页端口是63342而不是8080

问题&#xff1a; 安装了tomcat 并且也配置了环境&#xff0c;但是在tomcat下运行&#xff0c;总是在63342下面显示。这也就意味着&#xff0c;并没有运行到tomcat环境下。 找了好几个教程&#xff08;中间还去学习了maven&#xff0c;因为跟的教程里面&#xff0c;没有maven,但…

【 香橙派 AIpro评测】烧系统运行部署LLMS大模型体验Jupyter Lab AI 应用样例(新手入门)

文章目录 一、引言⭐1.1下载镜像烧系统⭐1.2开发板初始化系统配置远程登陆&#x1f496; 远程ssh&#x1f496;查看ubuntu桌面&#x1f496; 远程向日葵 二、部署LLMS大模型2.1 快速启动&#x1f496;拉取代码&#x1f496;下载mode数据&#x1f496;启动模型对话 三、体验 内置…

【算法笔记自学】第 10 章 提高篇(4)——图算法专题

10.1图的定义和相关术语 #include <cstdio>const int MAXN 100; int degree[MAXN] {0};int main() {int n, m, u, v;scanf("%d%d", &n, &m);for (int j 0; j < m; j) {scanf("%d%d", &u, &v);degree[u];degree[v];}for (int i…

自学鸿蒙HarmonyOS的ArkTS语言<九>自定义弹窗组件CustomDialog及二次封装自定义弹窗

一、自定义弹窗 CustomDialog struct CustomDialogBuilder {controller: CustomDialogController new CustomDialogController({ // 注意写法builder: CustomDialogBuilder({})})// controller: CustomDialogController // 这种预览会报错cancel?: () > voidconfirm?: (…