4 javascript browser-extension google-chrome-extension
我不太明白 Chrome 扩展 API 是如何工作的。很难理解background.js和content.js是如何工作的,但我当前的问题是,函数insertCSS(); 似乎需要 tabId,即使官方文档说它是可选的。
所以,这个平台上的答案都不能帮助我,因为我什至不理解整个 API 的概念。
那么有人可以解释一下为什么这样的事情不可能吗?
var tabInfo = chrome.tabs.getCurrentTab();
var id = tabInfo.tabId;
Run Code Online (Sandbox Code Playgroud)
这里有几个问题需要回答。
那么有人可以解释一下为什么这样的事情不可能吗?
Run Code Online (Sandbox Code Playgroud)var tabInfo = chrome.tabs.getCurrentTab();
简短回答:因为大多数 Chrome API 不返回值;它是异步的,这意味着 Chrome 的其他一些组件将在 JS 执行恢复时获取答案。
有两种方法可以处理:
async
/await
和/或 Promise。WebExtension polyfill可以帮助解决这个问题,但这超出了问题的范围。获取当前选项卡 ID 的最简单方法?
或“为什么chrome.tabs.getCurrentTab
不能帮助你”。
chrome.tabs.getCurrentTab()
返回调用页面的选项卡 ID 。请参阅文档。
这的实用性有限:只有扩展页面(而不是内容脚本)可以调用此 API。
扩展页面有:
正如评论中所确定的,这不是您的用例。
获取当前活动选项卡的实际方法是chrome.tabs.query()
使用查询{active: true, currentWindow: true}
,但请继续阅读。
根据评论重建,这是您遇到的实际情况:
我的内容脚本中有一个事件。我需要调用
tabs.insertCSS
API,因此我向后台页面发送消息以帮我完成此操作。我如何获得tabId
此通话的电话号码?
好吧,这里的关键是仔细查看runtime.onMessage
事件监听器签名:
回调参数应该是一个如下所示的函数:
function(any message, MessageSender sender, function sendResponse) {...};
什么是MessageSender?
包含有关发送消息或请求的脚本上下文信息的对象。
tabs.Tab
(可选)打开连接的tab
连接tabs.Tab
(如果有)。仅当从选项卡(包括内容脚本)打开连接时,并且仅当接收者是扩展程序而不是应用程序时,此属性才会出现。[...]
大奖。我们从内容脚本发送消息,并且侦听器sender.tab
“免费”获得信息。我们只需要快速浏览一下tabs
API 文档来看看 aTab
包含什么,我们就得到了它:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
chrome.tabs.insertCSS(sender.tab.id, {/*...*/});
});
Run Code Online (Sandbox Code Playgroud)
我当前的问题是,该函数
insertCSS()
似乎需要tabId
,即使官方文档说它是可选的
事实并非如此。如果你调用它时省略了 tabId,这使得该details
对象成为第一个参数,那么 Chrome 会假设你想要“当前窗口的活动选项卡”。
如果您尝试在后台页面的开发工具窗口中执行它,这似乎不起作用。这是因为在本例中没有这样的选项卡。当前窗口是您要在其中放入控制台命令的窗口。因此,没有 tabId 的调用执行的操作对于当前窗口的实际情况非常敏感。
也可能是您没有在当前活动选项卡中注入的权限,这也会失败。
一般来说,指定选项卡 ID 是值得的,它消除了扩展逻辑的不确定性。