我没有得到如何在内容脚本和页面操作弹出窗口之间传递数据。
我开始使用以下简单的骨架,它显示了标题中包含减号的任何页面的页面操作:
扩展清单(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
对象)允许我显示弹出窗口,我会很高兴...
答案 0 :(得分:1)
我认为你需要在弹出窗口中添加onClick
事件监听器:
chrome.pageAction.onClicked.addListener(function(tabs.Tab tab) {...});
请参阅文档here。
事件监听器的回调将为您提供tabId,它肯定是活动标签。
答案 1 :(得分:1)
您的代码中存在多个问题
chrome.extension.sendRequest({"what": "match", "title": title});
时不会触发。"page_action": {"default_popup": "popup.html", …},
是一个无效的假设,它将发送到扩展页。我试图多次阅读你的问题,但无法理解你想要达到的目标,你能解释一下吗?