52

chrome.tabs尽管我在权限块中设置了选项卡,但仍返回未定义。

"permissions": [
    "tabs",
    "http://*/*",
    "https://*/*"
],
"content_scripts": [
    {
        "matches": [
            "http://*/*",
            "https://*/*"
        ],
        "js": [
            "js/myScript.js"
        ],
        "all_frames": true
    }
],

但在 myScript.js 中,以下返回未定义。

chrome.tabs   
4

4 回答 4

88

由于内容脚本有其自身的局限性,

chrome.tabs仅在后台脚本和弹出脚本中可用。

如果您想使用,chrome.tabs则将消息从 content_script 传递到后台脚本并使用chrome.tabs.

于 2013-02-23T18:39:25.220 回答
16

内容脚本只能有限地访问 Chrome API。此访问不包括您尝试使用的 API(例如chrome.tabs)。如果您需要使用该 API,则必须在后台脚本1中执行此操作。

如 Chrome 的内容脚本文档中所列,内容脚本可用的 API 是 [我已将弃用的方法放在删除线格式]:

一些列出的 API 已被弃用,并且已经有一段时间了。那些已弃用的已移动到不同的位置(也在上面列出):

虽然没有正式弃用,但extension.lastError也可以作为runtime.lastError. 此时,通常在该位置引用它:

将您的扩展划分为后台脚本和内容脚本

您需要根据每种脚本可用的功能,将您的代码分为需要在后台脚本中的内容和需要在内容脚本中的内容。内容脚本可以访问它们被注入的网页的 DOM,但对扩展 API 的访问受限。后台脚本可以完全访问扩展 API,但不能访问网页内容。您应该阅读Chrome 扩展概述,以及从那里链接的页面,以了解哪些功能应该位于哪种类型的脚本中。

通常需要在内容脚本和后台脚本之间进行通信。为此,您可以使用消息传递。这允许您在两个脚本之间传递信息,以完成仅使用一种类型的脚本无法完成的事情。例如,在您的内容脚本中,您可能需要仅可从其他 Chrome API 之一获得的信息,或者您需要通过其他 Chrome 扩展 API 之一最合适(或仅)完成的事情。在这些情况下,您需要向后台脚本发送消息,使用chrome.runtime.sendMessage(),告诉它需要做什么,同时提供足够的信息让它能够这样做。然后,您的后台脚本可以将所需的信息(如果有)返回到您的内容脚本。或者,您有时会主要在后台脚本中完成处理。后台脚本可以注入内容脚本,或者只是向已经注入的脚本发送消息,以从页面获取信息,或对网页进行更改。


  1. 后台脚本是指在后台上下文中的任何脚本。除了实际background脚本之外,这还包括弹出窗口和选项页面等。但是,您可以确保始终可以从内容脚本接收消息的唯一页面是您在manifest.json中定义的实际background脚本。由于用户与浏览器的交互,有时其他页面可能可用,但它们并非始终可用。

此答案是从重复的问题中移出的,然后进行了修改。

于 2016-11-18T16:44:42.453 回答
1

https://developer.chrome.com/extensions/tabs#method-getSelected显示

被选中

chrome.tabs.getSelected(integer windowId, function callback)
自 Chrome 33 起已弃用。请使用 tabs.query {active: true}。
获取在指定窗口中选择的选项卡。

也许,您应该像这样在popup.js中使用 chrome.tabs.query

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    console.log(tabs[0].url);
});

重新加载您的扩展程序并在您的扩展程序的检查元素中检查结果。

结果图像

代码图像

https://developer.chrome.com/extensions/tabs#type-Tab显示 选项卡正在显示的 URL。仅当扩展程序的清单包含“选项卡”权限时,此属性才存在。(只是为了提醒某人忘记了。我刚测试时忘记了。)

于 2018-02-09T17:53:30.813 回答
-3

检查这个答案也https://stackoverflow.com/a/6718277/449345 这个对我有用

chrome.tabs.getSelected(null, function(tab){
    console.log(tab);
});
于 2015-11-09T10:49:35.793 回答