Javascript 获取';这';内容脚本的选项卡(未选中,非活动选项卡)?

Javascript 获取';这';内容脚本的选项卡(未选中,非活动选项卡)?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,有很多类似的问题,但它们都归结为chrome.tabs.getSelected或chrome.tabs.queryAPI,这在我的例子中并不适用 基本上,我需要做的是获取脚本运行所在选项卡的id,因此它不一定是活动的或选定的选项卡 根据: getCurrentchrome.tabs.getCurrent(函数回调) 获取进行此脚本调用的选项卡。可能是 如果从非制表符上下文(例如:后台)调用,则未定义 页面或弹出视图) 这意味着它应该在内容脚本中工作,但内容脚本中未定义chrome.tabs。为什

有很多类似的问题,但它们都归结为
chrome.tabs.getSelected
chrome.tabs.query
API,这在我的例子中并不适用

基本上,我需要做的是获取脚本运行所在选项卡的
id
,因此它不一定是活动的或选定的选项卡

根据:

getCurrentchrome.tabs.getCurrent(函数回调)

获取进行此脚本调用的选项卡。可能是 如果从非制表符上下文(例如:后台)调用,则未定义 页面或弹出视图)

这意味着它应该在内容脚本中工作,但内容脚本中未定义
chrome.tabs
。为什么会这样?有没有办法知道
这个
选项卡数据(从内容脚本运行的地方,而不是从选定的或活动的选项卡)

尽管文档上说大多数API都不强制使用
选项卡
权限,但我还是将其添加到了清单中,运气不好:

{
  "manifest_version": 2,
  "name": ...
  "permissions": [
    ...
    "tabs",
    ...
}
任何想法都非常感谢


get current/this tab
的用例是,当扩展完成其工作时,它需要重新加载作为工作流程一部分运行的页面,并且用户可以位于不同的选项卡或不同的窗口中。扩展的脚本仍然需要获得正确的tabId才能按预期工作。

看来我已经找到了问题的答案

诀窍是向后台脚本发送消息,并从中提取
sender
数据。发送方将包括脚本运行所在的
选项卡
对象

我使用的是
端口
,以下是我将描述的示例:

在内容脚本端:

    var port = chrome.extension.connect({
        name: "some name"
    });

    port.postMessage({"key":"some json here"})
背景方面:

chrome.extension.onConnect.addListener(function (port) {
    console.log(port.sender.tab)
})
port.sender
是一个包含tabId的对象(如果清单中添加了“tabs”权限,则包含tabUrl)

在我的例子中,我只是将tabId从后台发送回内容脚本:

port.postMessage({"tabId":port.sender.tab.id})

更多关于这方面的信息可以在doc和

中找到,看来我已经找到了我问题的答案

诀窍是向后台脚本发送消息,并从中提取
sender
数据。发送方将包括脚本运行所在的
选项卡
对象

我使用的是
端口
,以下是我将描述的示例:

在内容脚本端:

    var port = chrome.extension.connect({
        name: "some name"
    });

    port.postMessage({"key":"some json here"})
背景方面:

chrome.extension.onConnect.addListener(function (port) {
    console.log(port.sender.tab)
})
port.sender
是一个包含tabId的对象(如果清单中添加了“tabs”权限,则包含tabUrl)

在我的例子中,我只是将tabId从后台发送回内容脚本:

port.postMessage({"tabId":port.sender.tab.id})

有关这方面的更多信息可以在doc和中找到,您只能在
chrome扩展名://
方案的页面上使用
chrome.tabs.getCurrent
(作为扩展名的选项页面打开,或通过
chrome.tabs.create
chrome.windows.create
),或者如果您使用的是
chrome\u url\u覆盖
。背景、弹出窗口和嵌入选项页面没有当前选项卡,并且API不存在于内容脚本中。

有效地说,您只能在
chrome extension://
方案的页面上使用
chrome.tabs.getCurrent
(作为扩展的选项页或通过
chrome.tabs.create
chrome.windows.create
打开),或者如果您正在使用
chrome\u url\u覆盖
。背景、弹出窗口和嵌入选项页没有当前选项卡,并且API不存在于内容脚本中。

您不能在内容脚本中使用
chrome.tabs
。只允许使用4个chrome API(在中列出)@wOxxOm谢谢-getCurrent api的用例是什么?如果从后台运行它会返回未定义的tab(这很明显),但在脚本中它不可用。该方法对我来说很奇怪,你不能在内容脚本中使用
chrome.tabs
。只允许使用4个chrome api(在中列出)@wOxxOm谢谢-getCurrent api的用例是什么?如果从后台运行,它将返回未定义的选项卡(这很明显)但在脚本中它不可用。不幸的是,meThis认为该方法非常奇怪,这是进行此操作的最佳方法。尽管我建议发送一次性消息,而不是打开端口,因为这不是一个长期的连接。如果您已经解决了问题,请接受它作为正确答案,以方便未来用户@呃,离我接受它还有两天的时间-我不可能早点做-我真的试过了;)不幸的是,这是最好的方式。虽然我建议发送一次性消息,而不是打开端口,因为这不是一个长期的连接。如果您已经解决了问题,请接受它作为正确答案,以方便未来用户。@err1100,离我接受它还有两天的时间-我不可能更早地做到-我确实尝试过;)谢谢你,你救了我一天!我试图弄明白为什么我的chrome扩展名://page使用chrome.tabs.query使上下文无效,但是使用chrome.tabs.getCurrent所有功能都很好。谢谢,你救了我一天!我试图弄明白为什么我的chrome扩展名://page使用chrome.tabs.query使上下文无效,但使用chrome.tabs.getCurrent时一切都正常