如何在不使用 default_popup 的情况下 运行 popup.html? (CHROME 分机)

How to run popup.html without using default_popup? (CHROME EXTENSION)

所以,我遇到了这样一种情况,每次单击浏览器扩展图标时,我都希望背景和内容脚本是 运行。理想的行为是单击扩展程序图标,脚本 运行s,弹出窗口将打开,显示脚本抓取的数据(但这应该很快发生,脚本 运行s 和获取数据非常快)。如果 manifest.json 中定义了 default_popup,chrome.pageAction.onClicked 将不起作用,我认为这让我有两个选择:

  1. 使用 default_popup 并找出扩展程序图标已被其他方式单击。我在另一个堆栈溢出post中找到了这个解决方案,但解决方法是使用default_popup:“popup.html”,然后是[=28=中定义的popup.js ]会发消息说图标被点击了,然后当background.js收到这个消息,就执行脚本。我实现了这个想法并且它奏效了......有点。麻烦的是,弹出窗口总是会在脚本完全执行之前出现,所以在 next 单击之前,您无法在弹出窗口中实际显示脚本抓取的数据。我不确定是否有任何方法可以使用此方法获得我想要的行为,所以继续下一个:
  2. 除了在manifest.json中使用default_popup之外,我能想到的另一个解决方案是使用onClicked,然后以其他方式弹出弹出窗口。我也不确定这是否可行,我查看了 Whosebug 并没有发现任何类似的东西。

第二种方法可以吗?第一种方法能行得通吗?

您的选项 #1 是正确的,我认为所需要的只是用户第一次看到弹出窗口时的加载屏幕,并添加一些代码,以便在收到来自后端的消息后立即更新弹出窗口。可能需要查看一些代码才能更好地帮助那里。

选项 #2 不会真正起作用,除非您在新选项卡中打开弹出窗口(或将其设为全新的 HTML 页面)。我这样说是因为 Chrome 开发团队在这里有一条注释,他们将不支持打开弹出窗口,除非它来自用户手势 -- .

如果你想走那条路,它可能看起来像:

  • 从你的manifest.json中删除browser_action.default_popup
  • 在您的后台脚本中添加如下内容:
    chrome.browserAction.onClicked.addListener(() => {
        const data = dataMaker();
        chrome.tabs.create({
            url: `${chrome.runtime.getURL("app.html")}?data=${data}`
        });
    });
  • 然后在您的 html 文件中有一些 JS 可以读取查询字符串并相应地更新页面。

不过,这与您要求的方法不同,我认为您的原始路线可能仍然是最好的选择(在加载过程中添加了一些 JS)。