如何在不使用default_popup的情况下运行popup.html?(镀铬加长件)



因此,我遇到了一种情况,每次单击浏览器扩展图标时,我都希望运行背景和内容脚本。理想的行为是单击扩展图标,运行脚本,弹出窗口将打开,显示脚本捕获的数据(但这应该很快发生,脚本运行并很快获得数据(。由于如果manifest.json中定义了default_popup,chrome.pageAction.onClicked将不起作用,我认为这给我留下了两个选项:

  1. 使用default_popup并确定扩展图标是否已通过其他方式单击。我在另一篇堆栈溢出文章中找到了这个解决方案,但解决方法是使用default_popup:"popup.html";,然后popup.html中定义的popup.js将发送一条消息,表示图标已被单击,然后当background.js收到此消息时,它将执行脚本。我实施了这个想法,它奏效了。。。有点问题是,弹出窗口总是在脚本完全执行之前出现,因此在下一次单击之前,您无法在弹出窗口中实际显示脚本捕获的数据。我不确定是否有任何方法可以使用这种方法获得我想要的行为,以此类推:
  2. 我能想到的另一个解决方案是使用onClicked,然后让弹出窗口以其他方式出现,除了在manifest.json中使用default_popup。我也不确定这是否可能,我已经查看了stackoverflow,没有发现类似的内容

第二种方法可能吗?第一种方法能起作用吗?

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

选项#2不会真正起作用,除非你在一个新的选项卡中打开弹出窗口(或者只是让它成为一个全新的HTML页面(。我这么说是因为Chrome开发团队注意到,除非是用户手势,否则他们不会支持打开弹出窗口——https://stackoverflow.com/a/10484764/4875295.

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

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

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

最新更新