2

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

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

  • 扩展清单 ( 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});
    }
    

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

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

我想我可能可以chrome.tabs.executeScript用来交流,但这只是感觉很脏。

不过,我相信,这是一件应该非常简单的基本事情,我只是错过了一些东西。有人可以帮助我,最好是示例代码吗?

更新:我找到了Mappy 示例扩展,它用于chrome.tabs.onUpdated跟踪活动选项卡。不幸的是,这需要tabs许可。就个人而言,我想尽可能使用最少的权限。

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

4

2 回答 2

1

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

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

请参阅此处的文档。

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

于 2013-01-26T07:20:19.087 回答
1

您的代码中有多个问题

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

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

于 2013-01-26T10:17:44.277 回答