【问题标题】:Communicating with a content script on active tab from a Chrome extension's page action popup从 Chrome 扩展程序的页面操作弹出窗口与活动选项卡上的内容脚本通信
【发布时间】:2013-01-25 20:26:17
【问题描述】:

我不知道如何在内容脚本和页面操作弹出窗口之间传递数据。

我从以下简单的框架开始,它显示了标题中带有减号的任何页面的页面操作:

  • 扩展清单 (manifest.json):

    {
       …
       "permissions": ["http://example.org/*"],
       "background": {"scripts": ["background.js"]},
       "page_action": {"default_popup": "popup.html", …},
       "content_scripts": {
         "matches": ["http://example.org/*"],
         "js": ["content.js"]
       }
    }
    
  • 后台脚本(background.js):

    chrome.extension.onRequest.addListener(function (msg, sender, respond) {
      if (msg && msg.what === "match") {
        console.log("Match:", msg.title);
        chrome.pageAction.show(sender.tab.id);
      }
    }
    
  • 内容脚本 (content.js),检查文档标题:

    var title = document.title;
    if (title.indexOf("-") >= 0) {
      chrome.extension.sendRequest({"what": "match", "title": title});
    }
    

现在,在页面操作的弹出窗口中,我想显示匹配页面的标题。不是最后加载页面的标题(如使用 this answer 所做的那样),而是活动选项卡的标题。

虽然我的第一个查询是向内容脚本发送查询,但根据文档 chrome.extension.sendMessage 会将其发送给 所有 侦听器(即所有选项卡上的所有内容脚本),没有任何明确定义我将收到谁的回复。另外,我不能使用chrome.tabs.sendMessage,因为它需要 tabId。尝试使用chrome.tabs.getCurrent 查找当前选项卡将返回null,因为查询来自非选项卡上下文(来自弹出窗口)。

我想我可能可以使用chrome.tabs.executeScript 进行交流,但这感觉很脏。

不过,我相信这是一件基本的事情,应该很容易做到,但我只是错过了一些东西。有人可以帮我吗,最好是示例代码?

更新:我找到了Mappy example extension,它使用chrome.tabs.onUpdated 来跟踪活动标签。不幸的是,这需要tabs 许可。就个人而言,我希望尽可能使用最少的权限。

那么,不幸的是权限系统设计不好,我别无选择,只能这样做,还是有任何解决方法?如果chrome.pageAction.onClicked 事件处理程序(提供我需要的Tab 对象)允许我显示一个弹出窗口,我会很高兴...

【问题讨论】:

  • 您是否尝试从 popup.html 调用 content.js 脚本?
  • @im_benton,我怀疑这是可能的。内容脚本在另一个上下文中运行,与弹出窗口分开。据我了解,除了chrome.extension 消息总线之外,它们不共享任何东西。无论如何,出于好奇,我尝试在content.js 中声明一个函数,然后从popup.js(引用自popup.html 的脚本)调用它,但显然失败了。
  • “不幸的是,这需要tabs 权限。就我个人而言,我希望尽可能使用最少的权限。”这正是activeTab 权限的用途:developer.chrome.com/extensions/activeTab.html

标签: google-chrome-extension popup


【解决方案1】:

我认为您需要在弹出窗口中添加 onClick 事件侦听器:

chrome.pageAction.onClicked.addListener(function(tabs.Tab tab) {...});

请参阅文档here

事件侦听器的回调将为您提供肯定是活动选项卡的 tabId。

【讨论】:

  • 这个 onclick 监听器如何帮助 OP,他的清单中有 page_action": {"default_popup": "popup.html"
【解决方案2】:

您的代码中有多个问题

  • chrome.extension.sendRequest({"what": "match", "title": title}); 中的 chrome.extension.sendRequest 已弃用
  • 当您的清单中有 "page_action": {"default_popup": "popup.html", …}, 时,chrome.pageAction.onClicked 不会触发。
  • chrome.extension.sendMessage will send it to all listeners (i.e. all my content scripts on all tabs), 是一个无效的假设,它将发送到扩展页面。

我多次尝试阅读您的问题,但无法理解您想要实现的目标,您能解释一下吗?

【讨论】:

  • 我想要什么: 1. 内容脚本对文档和正匹配执行检查,显示页面操作图标。在我的示例中,它正在检查文档标题是否存在“-”。 2.用户可以打开多个标签并以任意顺序切换它们。 3. 当用户单击页面操作图标时,会打开一个弹出窗口,其中包含有关当前选项卡中文档的一些信息(即选项卡,页面操作所属),由内容脚本提取。我询问了文档标题,但理想的示例是显示页面第一个 <h1> 的文本。
  • @drdaeman 如果您只需要页面标题而不需要内容脚本,tabs api 可以为您提供此信息,检查this,这一切都可以通过message passingcontent scripts 和@ 实现987654328@,现在你在哪里?
  • 我试图将消息从弹出页面传递到在活动选项卡中运行的内容脚本。
  • @drdaeman:你能贴出消息传递的代码吗,我会尝试找出问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 2011-08-31
  • 2013-09-05
  • 1970-01-01
  • 2013-10-12
  • 2017-12-24
相关资源
最近更新 更多