首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >只在网页中注入一次内容脚本

只在网页中注入一次内容脚本
EN

Stack Overflow用户
提问于 2022-11-30 00:33:48
回答 1查看 60关注 0票数 0

我正在尝试在上下文菜单上注入内容脚本,点击扩展清单版本3,我需要检查它是否已经注入。如果没有注入内容脚本,则注入内容脚本。这个条件必须得到满足。有人能帮我吗?

我们可以用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALREADY_INJECTED_FLAG

但是只能在内容脚本中检查这一点,因此这种方法不能像预期的那样工作。

payload.js(内容脚本)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function extract() {
    
    htmlInnerText = document.documentElement.innerText;
    url_exp = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;
    regex =  new RegExp(url_exp)
    list_url = htmlInnerText.match(url_exp)

    ip_exp = /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/;
    list_ip = htmlInnerText.match(ip_exp)

    hash_exp = /\b[A-Fa-f0-9]{32}\b|\b[A-Fa-f0-9]{40}\b|\b[A-Fa-f0-9]{64}\b/g
    list_hash = htmlInnerText.match(hash_exp)

    chrome.storage.local.set({ list_url: list_url, list_ip: list_ip, list_hash: list_hash });

}

chrome.runtime.sendMessage( extract());

background.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
genericOnClick = async () => {

    // Inject the payload.js script into the current tab after the backdround has loaded
    chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        chrome.scripting.executeScript({
            target: { tabId: tabs[0].id },
            files: ["payload.js"]
        },() => chrome.runtime.lastError);
    });
    

    // Listen to messages from the payload.js script and create output.
    chrome.runtime.onMessage.addListener(async (message) => {
    
        chrome.storage.local.get("list_url", function (data) {
            if (typeof data.list_url != "undefined") {
                urls = data.list_url
            }
        });
        chrome.storage.local.get("list_ip", function (data) {
            if (typeof data.list_ip != "undefined") {
                ips = data.list_ip
            }
        });
        chrome.storage.local.get("list_hash", function (data) {
            if (typeof data.list_hash != "undefined") {
                hashes = data.list_hash;
            }
        });

        
        if ( hashes.length>0 || urls.length>0 || ips.length>0 ){
            chrome.windows.create({url: "output.html", type: "popup", height:1000, width:1000});
        }
    });
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-30 05:35:09

在我的第一个上下文菜单上单击

,我只得到一次输出html。第二次单击时,我同样两次获得输出html。

这种行为是由两个因素综合造成的。

第一因素

你打电话给chrome.runtime.onMessage.addListener() You genericOnClick()。因此,每次用户单击上下文菜单项时,代码都会添加一个新的onMessage侦听器。如果将命名函数传递给chrome.runtime.onMessage.addListener(),则不会出现问题,因为命名函数只能为事件注册一次。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function on_message(message, sender, sendResponse) {
    console.log("bg.on_message");
    sendResponse("from bg");
}

chrome.runtime.onMessage.addListener(on_message);

第二因素

但是,您没有将命名函数注册为onMessage处理程序。你在注册一个匿名函数。每次单击上下文菜单项都会创建和注册一个新的匿名函数。因此,在单击上下文菜单项后,将有N个不同的onMessage处理程序,每个处理程序都将打开一个新窗口。

解决方案

  1. 将onMessage处理程序定义为一个命名函数,如上面所示.
  2. 在函数之外调用chrome.runtime.onMessage.addListener() .

你不必同时做1和2,两者都能解决你的问题。但我建议两种方法都做,因为它更干净。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74624848

复制
相关文章
[1084]windows搭建clojure开发环境
关于clojure是什么东西就自行百度了,简单说就是用Lisp语言写的程序,编译成.class放在jvm上面跑,所以是需要jre的。独立的clojure可以从官方网站找到,目前稳定版本是1.8,官网https://clojure.org/index。下载后是一个zip,里面有个jar是clojure-1.8.0.jar,可以像常用的jar那样运行,这样会得到一个REPL交互环境,当然需要预先配置好jre(java8)。
周小董
2021/11/30
2.2K0
[1084]windows搭建clojure开发环境
(cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")
前言  书接上一回,在了解cljs基本语法后并在clojurescript.net的奇特错误提示后,我们必须痛定思痛地搭建一个本地的开发环境,以便后续深入地学习cljs。 现有的构建工具  由于浏览器仅能运行JS,而无法直接运行cljs,因此我们需要搭建一个预编译环境将cljs编译成JS后再在浏览器中运行。预编译无非就是JVM和Nodejs两个环境,但具体使用时有如下几种构建工具。 直接JVM编译 Lein方案 Boot方案 Lumo方案 Shadow-cljs方案 cljs/tool方案  其中Lein
^_^肥仔John
2018/01/18
9150
一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)
Storm的官方网址:http://storm.apache.org/index.html 1:集群部署的基本流程(基本套路): 集群部署的流程:下载安装包、解压安装包、修改配置文件、分发安装
别先生
2018/01/02
1.4K0
一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)
Clojure 运行原理之字节码生成篇
上一篇文章讲述了 Clojure 编译器工作的整体流程,主要涉及 LispReader 与 Compiler 这两个类,而且指出编译器并没有把 Clojure 转为相应的 Java 代码,而是直接使用 ASM 生成可运行在 JVM 中的 bytecode。本文将主要讨论 Clojure 编译成的 bytecode 如何实现动态运行时以及为什么 Clojure 程序启动慢,这会涉及到 JVM 的类加载机制。
飞驰的西瓜
2022/07/26
7430
Clojure 运行原理之字节码生成篇
将class文件打成jar包
如果真相是种伤害,请选择谎言。如果谎言是一种伤害,请选择沉默。如果沉默是一种伤害,请选择离开。——徐志摩 命令很简单,在class文件目录下执行: jar -cvf ruben.jar . 例如我这里执行后: 预览也能看到大致结构
阿超
2022/08/17
6050
将class文件打成jar包
Clojure和CloudStack
[原文由Sebastien Goasguen撰写]
Techeek
2018/01/11
1.1K0
.java编译成.class 与 .class反编译成.java
了解下这两个文件类型:.java文件是给人看的,.class是给计算机看的。程序员编写的是.java文件,经编译后生成.class文件给计算执行。
全栈程序员站长
2022/08/09
2.7K0
.java编译成.class 与 .class反编译成.java
处理Sprint Boot与Storm1.2.2日志实现的冲突,使用logback记录日志
通过mvn dependency:tree可以看到Sprint Boot Starter和Storm引入的日志记录框架不相同的,如下:
heasy3
2020/08/02
5210
聊聊storm的reportError
storm-2.0.0/storm-client/src/jvm/org/apache/storm/task/IErrorReporter.java
code4it
2018/11/20
8440
Clojure 学习入门(2)—— eclipse 插件
以前听说过LISP函数式编程,也听人说Erlang的牛逼,接触了Clojure才知道,原来Clojure就是JVM中的Erlang。网上基于Ubuntu环境下开发Clojure的资料太少,在这里整理总结,分享给大家。
阳光岛主
2019/02/18
1.1K0
Clojure 学习入门(2)—— eclipse 插件
如何发布jar到clojars
Clojars 是一个为开源 Clojure 类库打造的仓库,截止2017年9月17日,大概有19831个项目发布在上面。整个网站也是用 Clojure 编写的。
lambeta
2018/08/17
8640
如何发布jar到clojars
聊聊storm的reportError
storm-2.0.0/storm-client/src/jvm/org/apache/storm/task/IErrorReporter.java
code4it
2018/10/23
8730
聊聊storm的reportError
一名Clojurian的Emacs配置
我是一名热衷于函数式编程的Clojurian(Clojure粉),网络ID是lambeta(λβ),读作/‘læmeitə/,个人的博客网站是https://lambeta.com。俗话说,工欲善其事必先利其器,完善开发工具与我而言是一件愉快的事情,所以想把经验集结成文字,便有了这篇文章。这篇文章不会介绍太多花式或有深度的emacs配置,更多是摸索学习的过程,其中充满了乐趣。
lambeta
2018/08/17
2.8K0
ClojureScript魔法堂:搭建开发环境
一、前言                                 当看到Lisp等函数式编程语言的语法是 (say (concat "hello" "world")) 这样的时候,我就有种深入学习的冲动,因为它的语法和自己一直使用的Java、C#都不同,酷比了!(我承认我是语法控^_^)又由于我主要玩的是JavaScript,恰好ClojureScript就是纯函数式的JS超集,于是决定以ClojureScript作为函数式编程的起点。(虽然JavaScript具有函数式语言的特点:函数为一等公民,
^_^肥仔John
2018/01/18
1.2K0
Clojure 学习入门(9)—— 连接redis
project.cli 添加redis依赖: [clj-redis "0.0.12"]
阳光岛主
2019/02/18
7490
Clojure 学习入门(9)—— 连接redis
Java文件是怎么编译成Class文件的
其实就是我们前端的编译过程,是通过javac(编译器)把java文件变成.class字节码文件。
向着百万年薪努力的小赵
2022/12/02
1.4K0
Java文件是怎么编译成Class文件的
Twitter Storm: Maven配置
为了开发storm topology, 你需要把storm相关的jar包添加到classpath里面去: 要么手动添加所有相关的jar包, 要么使用maven来管理所有的依赖。storm的jar包发布在Clojars(一个maven库), 如果你使用maven的话,把下面的配置添加在你项目的pom.xml里面。
星哥玩云
2022/06/30
3560
Clojure Web 开发-- Ring 使用指南
在 Clojure 众多的 Web 框架中,Ring 以其简单统一的 HTTP 抽象模型脱颖而出。Ring 充分体现了函数式编程的思想——通过一系列函数的组合形成了一个易于理解、扩展的 HTTP 处理链。
飞驰的西瓜
2022/07/26
8840
Clojure Web 开发-- Ring 使用指南
Kafka的生产者和消费者代码解析
1:Kafka名词解释和工作方式 1.1:Producer :消息生产者,就是向kafka broker发消息的客户端。 1.2:Consumer :消息消费者,向kafka broker取消息的客户端 1.3:Topic :可以理解为一个队列。 1.4:Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的
别先生
2018/04/02
2K0
Kafka的生产者和消费者代码解析
Clojure 学习入门(7)—— 连接mysql
Clojure的contrib包中实现了对现有JDBC的封装,在wiki上有连接,该页面上包含了对不同的数据库的连接方法和基本的操作,但是这个页面上没有提供足够的信息,足够一个初学者能够使用Clojure来完成一个SQL操作。本文中我们将利用Clojure和Lein工具,简介一下做开发的基础。当然网上也有非常多对Clojure的SQL操作进行封装的库,我们这里没有使用。
阳光岛主
2019/02/18
1.1K0
Clojure 学习入门(7)—— 连接mysql

相似问题

创建对所有对象都相同的属性

231

数组对象所有索引都具有相同的值( java )。

13

所有对象都具有相同的名称

10

Array.fill重复给出相同的对象。为什么?

10

比较几乎所有字段都相同的对象

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文