【问题标题】:Chrome extension: Activate and execute background.js on click from popup.jsChrome 扩展:点击 popup.js 激活并执行 background.js
【发布时间】:2018-08-27 21:55:28
【问题描述】:

据我了解,Manage Events with Background ScriptsMigrate to Event Driven Background Scripts 后台脚本应该在events 触发时被激活。

background.js

chrome.runtime.onMessage.addListener((message, sender, reply) => {

    const json = message.data;
    // some code

    reply({ result: true })
    return true;    
});

popup.js

chrome.runtime.sendMessage({ data: [<ArrayWithData>] },
    function (response) {
        logger.log(response);
    }
);

一切正常,但仅在活动背景的情况下。

为什么后台没有激活?有人可以解释我的错误是什么吗? 或者如何在 popup.js 中点击时激活和执行 background.js

我知道,如果我在 ma​​nifest.json 中更改 persistence: true 或者只是删除它,一切都会正常工作。但我想保留persistence false 并在需要时触发 background.js。

【问题讨论】:

  • 发布的代码不足以诊断问题。您是否依赖后台脚本中的全局变量?首先,也许您根本不需要后台脚本,因为弹出窗口具有相同的访问级别。其次,确保您查看的是正确的控制台:右键单击弹出窗口并单击“检查”。
  • @wOxxOm,来自文档:触发事件时应激活后台脚本。我从弹出 json 调用事件并且 onMessage 没有触发。我还需要添加哪段代码?顺便说一句,nackground 脚本处于非活动模式,因此 console.log 将不起作用。我的帖子的主要目标是在事件触发时设置背景活动。
  • 你需要显示MCVE,否则我们只能随机猜测。看来您误解了文档。后台脚本在单独的页面中运行,并且当persistent 为false 时,该隐藏页面会自动加载到消息中。请参阅here 如何检查它。弹出窗口也是一个单独的页面。后台脚本不在弹出窗口内运行(有些人在 popup.html 中加载它,但这是由于误解造成的错误)。您的 console.log 在弹出窗口中运行,因此它将打印在弹出窗口的 devtools 控制台中。
  • @wOxxOm,对不起,也许我没有听错你。因为我已经展示了 MCVE。我也没有使用console.log 的问题。我知道背景是单独的页面。我的问题比较清楚。当我从 popup.js 发送消息时,我需要后台激活。
  • 当我说它不是 MCVE 时,这意味着发布的代码没有重现问题,因此缺少“V”,我个人觉得争论这些事情很累。假设问题中未发布的所有其他内容均已正确实施,已发布的代码成功运行(logger.log 为 console.log)。

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


【解决方案1】:

您错过了this part in the documentation,它解释了如何从popup.js 激活后台脚本。获取后台页面对象后,只需要调用任意函数,甚至访问字段即可。

我总是把它放在我的popup.js 的顶部:

// Initialize background page
chrome.runtime.getBackgroundPage(function(backgroundPage) {
  console = backgroundPage.console;
})

这样我还可以从弹出窗口中查看控制台日志以及后台视图中的日志

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2014-09-18
    相关资源
    最近更新 更多