代码之家  ›  专栏  ›  技术社区  ›  vir us

获取内容脚本的“此”选项卡(未选中,未激活选项卡)?

  •  0
  • vir us  · 技术社区  · 7 年前

    有一些非常相似的问题,但它们都归结为 chrome.tabs.getSelected chrome.tabs.query API不适合我的情况。

    基本上我需要做的是 id 脚本运行的选项卡的名称-因此它不一定是活动的或选定的选项卡。

    根据 the doc :

    getCurrent(获取当前) 镀铬。选项卡。getCurrent(函数回调)

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

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

    即使医生说 tabs 对于大多数API,权限不是强制性的,我已经将其添加到清单中,但运气不好:

    {
      "manifest_version": 2,
      "name": ...
      "permissions": [
        ...
        "tabs",
        ...
    }
    

    非常感谢您的任何想法

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Josh Lee ZZ Coder    7 年前

    实际上,您只能使用 chrome.tabs.getCurrent chrome-extension:// 方案(作为扩展选项页打开,或通过 chrome.tabs.create chrome.windows.create ),或者如果您正在使用 chrome_url_overrides 。后台、弹出窗口和嵌入选项页面没有当前选项卡,并且内容脚本中不存在API。

        2
  •  1
  •   vir us    7 年前

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

    诀窍是将消息发送到后台脚本并提取 sender 来自那里的数据。发件人将包括 tab 运行脚本的对象。

    我正在使用 ports 以下是我将描述的示例:

    在内容脚本端:

        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 是一个 MessageSender 对象,该对象将包含tabId(如果清单中添加了“tabs”权限,则为tabUrl)

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

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

    有关这方面的更多信息,请访问 messaging 文档和in this api doc