【问题标题】:Chrome Extension set toggle switch state in all tabsChrome 扩展在所有选项卡中设置切换开关状态
【发布时间】:2020-06-19 17:32:17
【问题描述】:

我正在制作一个简单的 Chrome 扩展程序,其中包含一个简单的开/关开关,见下文:

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

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

我的做法如下:

  1. 向开关添加事件监听器

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

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

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

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

这是我的

background.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()"
    });
}

content-script.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 扩展程序的新手!

有关其他上下文,这里是我的 ma​​nifest.json 中的 content_scripts/background

感谢您的帮助

【问题讨论】:

  • 感谢@elegant-user ,它导致了一个新错误:无法建立连接。接收端不存在。我肯定会使用 chrome.extension.onMessage 发送消息。我刚刚发现如何调试background.js,没有错误,并且“正在加载后台js!”正在开火
  • 我想我在找到背景调试后得到了答案,你的回答顺便让我找到了答案!谢谢
  • 作为修改后的问题@elegant-user ,如果您想回答的话。你认为我应该切换 Background.js 中的按钮吗?或者我应该在我的 content-script.js 中执行此操作。随时发布答案作为回复,以便我接受
  • 或者更确切地说,我应该在我的 popout.js 或我的内容脚本中切换按钮。不确定这里的最佳做法是什么
  • chrome.extension.onMessage 已于 5 年前弃用,请不要传播过时信息。

标签: javascript google-chrome google-chrome-extension


【解决方案1】:

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

popup.js:

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

background.js:不需要

content.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
}

注意事项:

  • 后台脚本运行在一个单独的隐藏后台页面中,该页面有its own devtools

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

【讨论】:

  • 这是一个非常简洁的答案,它消除了我的许多误解。我仍在调查自己,但我根据您的建议编辑了该主题。遇到一个问题,当我在扩展程序之外单击时,状态会重置,并且其他选项卡仍未更新。再次感谢您的帮助。
  • 好吧,你需要在 popup.js 的开头读取当前状态并相应地设置 DOM 元素。每次显示时都会重新创建弹出窗口的执行环境,并在隐藏时销毁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 2011-01-25
  • 2022-08-16
  • 1970-01-01
  • 2016-11-04
相关资源
最近更新 更多