Chrome 扩展程序在所有选项卡中设置切换开关状态

2023-12-09

我正在制作一个简单的 Chrome 扩展,其中包含一个简单的开/关开关,如下所示:

enter image description here

每当我启用此开关时,我希望新的开/关状态能够反映在所有其他活动选项卡/新选项卡/chrome 实例中。

目前还没有发生这种情况,如果我在一个选项卡中启用它,它在另一个选项卡中仍然被禁用。

我的方法如下:

  1. 为交换机添加事件监听器

  2. 切换值,并将新值存储在 chrome.storage 中

  3. Send a chrome.runtime向后台脚本发送消息,并更新所有 chrome 实例。

问题:每当我切换开关时,我都会收到以下错误:

enter image description here

另外,由于某种原因,我的background.js从未初始化,可能与上面的错误有关。

这是我的

背景.js(监听要发送的消息,以便我可以更新其他选项卡)

console.log('?! loading background js !?') // this never fires :(

// Whenever a message has been passed, such as toggling the enable/disable switch, communicate that with other Chrome tabs/instances.
chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse) {
        // todo: update all chrome tabs with new switch state
        console.log('reached Background message handler!')
    }
);

popup.js(监听点击事件,执行切换 chrome.storage 切换值的脚本)

// when the toggle is updated, run our script
document.getElementById('enable-site-blocking').onclick = executeBlocking;

function executeBlocking() {
    chrome.tabs.executeScript({
        code: "setToggleState()"
    });
}

内容脚本.js(单击切换按钮时执行,设置存储状态并发送运行时消息)

setToggleState();

function setToggleState() {
    chrome.storage.sync.get(['isExtensionActive'], function (storage) {
        const invertedState = !storage.isExtensionActive;
        chrome.storage.sync.set({
            isExtensionActive: invertedState
        });

        console.log('sending message')

        // send an update to all other Chrome processes
        chrome.runtime.sendMessage({
            greeting: "hello"
        }, function (response) {
            console.log("done sending message");
        });
    });
}

所以,我的问题如下:

  1. 对于维护跨选项卡切换开关的状态,我的方法是否正确?如果不是,我应该改变什么?
  2. 导致上述错误的原因可能是什么?
  3. 为什么我的background.js永远不会执行?

抱歉,如果问题很简单,我是 Chrome 扩展的新手!

For additional context, here are the content_scripts/background in my manifest.json enter image description here

感谢您的任何帮助


不需要background.js或消息传递,只需在popup.js中设置值并在内容脚本中使用chrome.storage.onChanged侦听器。

弹出.js:

function setToggleState() {
  chrome.storage.sync.get('isExtensionActive', storage => {
    chrome.storage.sync.set({
      isExtensionActive: !storage.isExtensionActive,
    });
  });
}

背景.js:没有必要

内容.js:

chrome.storage.sync.get('isExtensionActive', storage => {
  toggleSomething(storage.isExtensionActive);
});

chrome.storage.onChanged.addListener(changes => {
  if (changes.isExtensionActive) {
    toggleSomething(changes.isExtensionActive.newValue);
  }
});

function toggleSomething(state) {
  console.log('new state:', state);
  // ........... do something
}

Notes:

  • 后台脚本在单独的隐藏后台页面中运行,该页面具有它自己的开发工具.

  • 该弹出窗口也是单独窗口中的单独页面,因此它具有单独的开发工具:在弹出窗口内右键单击,然后单击“检查”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome 扩展程序在所有选项卡中设置切换开关状态 的相关文章

  • 以跨浏览器兼容的方式触发 onresize

    我想从后面的 C 代码触发 onresize 事件 我认为这可以完成 Page clientScript RegisterScriptBlock this getType id javascript code 我尝试过 element on
  • 如何使用 TypeScript 和 Angular 2 将插件添加到 ng2-ckeditor ?

    我正在尝试添加Justify插件到我的 ckeditor 但不幸的是我找不到任何关于如何将插件添加到 ng2 ckeditor 的信息 另外 我找不到任何应该添加插件的目录或配置文件 我正在使用 ng2 ckeditor1 0 6使用 Ty
  • 如何在 .tsx 打字稿中包含 .css 文件?

    如何在 tsx 中包含 css 文件以及如何使用它 即我如何渲染静态文件 import as React from react import Header from header import home css export class H
  • async.js 和系列问题

    连接后尝试运行 fetch 提取比连接更快 并且在控制台中我收到提取错误 因为它返回结果的速度比连接完成的速度快 但在异步系列的文档中 有一个工具可以在第一个返回结果后运行第二个函数 Settimeouts 可以保存情况 但它并不美观 当一
  • Morph 目标为 Three.js

    我正在尝试开始使用变形目标和 Three js 然而 关于这个主题的文档似乎并不多 当我查看源代码时 morphTargetInfluences 似乎是有魔力 这是如何运作的 我该如何使用这个 值为1就是全力吗 如何区分同一模型上的不同变形
  • html/javascript 链接到本地​​文件

    我正在尝试使用 JavaScript 显示本地文件的链接 但它不起作用 我不确定我做错了什么 html是
  • Reactjs 中的嵌套注释

    我有以下 json comments id 1 comment text asdasdadasdsadsadadsa author adsfasdasdsad post id 1 ancestry null archived false c
  • 无法在react-native android中设置ShadowColor

    环境 环境 操作系统 macOS High Sierra 10 13 1 节点 8 9 1 纱线 0 17 10 npm 5 6 0 守望者 4 7 0 Xcode Xcode 9 2 内部版本 9C40b Android Studio 2
  • 打字稿 keyof 返回字符串数组

    假设我有一堂课 class Test propA propB propC 我想创建一个返回字符串数组的方法 并将其键入为仅 Test 类中存在的键 我该如何使用keyof特征 class Test propA propB propC get
  • 类型“AngularFirestoreCollection”上不存在属性“onSnapshot”

    我正在尝试将侦听器与云 Firebase 分离 但仍然收到此错误 类型 AngularFirestoreCollection 上不存在属性 onSnapshot 你知道我应该进口什么吗 我直接从 Firebase 文档中复制此代码 let
  • 如何创建自定义输入类型?

    例如 我想创建一个类似于 AngularJS 实现 电子邮件 的方式的自定义输入类型
  • QUnit 不会运行测试

    我刚刚开始使用 QUnit 并遇到问题 我目前正在使用 TypeScript 它是一个 JavaScript 编译器 我在与我的主要课程结构平行的课程中进行测试 在每个类中 我都有一个名为 runTests 的函数 为了执行这些测试 我循环
  • Javascript 桥接到 Flash 以在 Flash 中存储 SO“cookie”

    读完这个问题后如何唯一地识别访问我网站的计算机 https stackoverflow com questions 216542 how do i uniquely identify computers visiting my web si
  • Kendo Grid:取消编辑删除新行

    这里有一个demo http plnkr co edit X4ei0zPYiZ1H8AiCTy8B p preview对于我正在经历的行为 如果您编辑 id 为 1 的现有行 将文本更改为其他内容 然后按取消按钮 该行将正确恢复到之前的状态
  • 如何在 Typescript 中使用默认值定义可选构造函数参数

    是否可以有带有默认值的可选构造函数参数 如下所示 export class Test constructor private foo string foo private bar string bar 这给了我以下错误 参数不能有问号和初始
  • 如何将 Jitsi Meet 添加到 Vuejs

    我已在 public html 的正文中加载了 jitsi meet 脚本 并且我有一个组件 如下所示
  • 迭代 Javascript 对象[重复]

    这个问题在这里已经有答案了 我有一个 Javascript 对象 var a tag1 Stocks acctType1 individual compare1 contains match name1 scrapedaccounttype
  • 将 jQuery 集成到电子应用程序中

    我正在尝试将 jquery 功能添加到用 Electron 编写的桌面应用程序中 使用电子快速启动存储库 我将下载的 jquery 文件添加到main html像这样的文件 or so 然后在index js我正在文件中添加代码create
  • eslint/prettier 在 html 标签中添加不需要的空间

    我正在尝试向我的项目添加配置 以便代码自动格式化 我对 VS Code 中的用户设置进行了一些更新 还安装了 eslint 和 prettier 现在 每当我尝试保存我的代码时 都会从中得到改变 div div div div div di
  • 如何使用EventManager监听Angular中的window.resize事件?

    我从这个 stackoverflow 借用了一些代码 角度窗口调整大小事件 https stackoverflow com questions 35527456 angular window resize event答案的作者说我应该使用事

随机推荐

  • jqueryui自动完成限制多项选择

    我正在使用 jQuery UI 自动完成 并试图限制多个结果 基本上 我正在构建一个 PM 系统 我正在使用 收件人 字段的自动完成功能 但我试图限制一条消息可以发送给的人数 因此 将最大选择限制为 25 有什么办法可以限制这个吗 还有关于
  • Android中如何保存RecyclerView的滚动位置?

    我有位于 SwipeRefreshLayout 内部的 Recycler 视图 此外 能够在另一个活动中打开每个项目 返回到 Recycler 后 我需要滚动到所选项目 或滚动到上一个 Y 怎么做 是的 我用谷歌搜索 在 StackOver
  • 如何使用 thymeleaf 序列化 POJO?

    我想在 a 中插入一个 POJO 普通的旧 java 对象 作为普通 Json
  • 使用 AVG() 进行 MySQL 查询时出现问题

    我正在使用一个查询 该查询取每个给定 id 的所有记录的平均值 query SELECT bline id AVG flow as flowavg FROM blf WHERE bline id BETWEEN 1 AND 30 GROUP
  • 将结构放入匿名名称空间有什么作用? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么使用未命名的命名空间以及它们有什么好处 查看某人的代码 这就是他们声明的内容 namespace struct myStruct int x int y obj1 在一个函数中我看到它是这样使用
  • 允许调度程序切换正在执行的线程的机制是什么?

    我知道CPU调度程序使用时间片并让一个线程运行指定的时间 然后切换线程 但我不明白的是CPU如何知道停止执行线程并切换任务 它不能在每条指令后重复检查时钟 对吗 这将花费大量的开销 这将是非常浪费的 我不认为它在线程上使用一些确定性计算来在
  • 使用 sockaddr_in 的值填充 sockaddr_storage 结构

    我有一个sockaddr storage对象 我需要用用户提供的值填充它 请注意 用户可以提供其中之一AF INET or AF INET6作为填充结构的域 void fill sockaddr storage addrStruct int
  • 可变参数宏中的参数计数无效

    我正在尝试创建一个宏 它将迭代定义的术语列表 并为每个术语调用另一个宏 可能还带有附加参数列表 这是我得到的 define ITERATE OVER TERMS MACRO MACRO Term1 VA ARGS MACRO Term2 V
  • 如何按

    from pywinauto import application app application Application start C Program Files Microsoft Office Office12 EXCEL exe
  • 删除 URL 中的 .PHP 文件扩展名

    我在强制删除 URL 中的 php 文件扩展名时遇到了一个小问题 如果用户执行以下操作 我可以成功删除 php 文件扩展名 Remove PHP if original request is foo bar php RewriteCond
  • Woocommerce 调用网址(完成订单后)

    我有 3 个问题 需要帮助 我不知道 如何运行这个插件 给我致命错误 请检查我的脚本 我是初学者 需要管理页面帮助来设置 APIkey 并选择调用 URL 的语言http xxx CZ or http xxx SK 此页面尚未编写脚本 如何
  • 通过 CLI 在 java 中传递参数

    在传递参数时Java通过CLI我们通常会像 java cp jar classname args 0 args 1 我想传递像这样的参数 host hostname user username password password等等 请帮助
  • 有没有一种方法可以从列表字典中创建虚拟变量的数据框?

    在 pandas 中 我有一本字典 如下所示 Anemones allies Carnivore Ants bees wasps Omnivore Herbivore Nectar Insects Parasite Beetles bugs
  • 使用 python 3.5 str.format 左截断?

    问 是否可以使用 Python 3 5 的字符串格式化语法来创建格式字符串以进行左截断 基本上我想做的是获取 git SHA c1e33f6717b9d0125b53688d315aff9cf8dd9977 仅使用格式字符串 仅显示正确的
  • 根据列值对数据帧中的值进行插值

    假设我有以下问题 import pandas as pd import numpy as np xp 0 0 0 5 1 0 np random seed 100 df pd DataFrame np random rand 10 4 co
  • 使用 Selenium 保存页面

    我会再试一次 下面的代码是我从另一个网站复制的 用户说它有效 显示屏幕截图 原始代码 我测试了代码 没有错误 但没有文件保存 所有问题都使用此答案来保存文件 一个问题 为什么页面未保存 或者如果保存 文件在哪里 Thanks from se
  • 将 bool 数组转换为 int32、unsigned int 和 double?

    我有大小为 32 48 64 的布尔数组 每个布尔值代表一个位 如何将它们转换为具有良好性能的数字 int unsigned int double48 double64 例如 bool ar 0 0 0 0 0 0 0 0 0 0 0 0
  • laravel数据库迁移中如何实现分区

    使用 Laravel 5 3 如何实现分区 以下是我尝试在迁移中添加的 mysql 表结构 CREATE TABLE settings id INT 10 unsigned NOT NULL AUTO INCREMENT client id
  • Braintree PHP SDK cURL 异常

    我不断地回来Braintree Exception SSLCertificate当我尝试使用生成客户端令牌时出现异常Braintree ClientToken generate 我已经加载了 SDK 并且我的 PHP 设置似乎满足了 SDK
  • Chrome 扩展程序在所有选项卡中设置切换开关状态

    我正在制作一个简单的 Chrome 扩展 其中包含一个简单的开 关开关 如下所示 每当我启用此开关时 我希望新的开 关状态能够反映在所有其他活动选项卡 新选项卡 chrome 实例中 目前还没有发生这种情况 如果我在一个选项卡中启用它 它在