chrome.tabs在内容脚本中返回undefined

时间:2013-02-22 23:19:04

标签: google-chrome google-chrome-extension

尽管我在权限块中设置了标签,但chrome.tabs仍返回undefined。

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

但是在myScript.js中,以下内容返回undefined。

chrome.tabs   

4 个答案:

答案 0 :(得分:55)

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

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

如果您想使用chrome.tabs,请将消息从content_script传递到后台脚本,然后使用chrome.tabs进行播放。

答案 1 :(得分:8)

Content scripts对Chrome API的访问权限有限。此访问权限不包括您尝试使用的API(例如chrome.tabs)。如果您需要使用该API,则必须在background script 1 中执行此操作。

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

  

一些列出的API已被弃用,已经有一段时间了。那些被弃用的人已经搬到了不同的地方(也在上面列出):

虽然未正式弃用,extension.lastError也可用runtime.lastError。此时,通常在该位置引用它:

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

根据每种脚本可用的功能,您需要将代码分离为后台脚本中需要的内容以及内容脚本中需要的内容。内容脚本可以访问注入它们的网页的DOM,但访问扩展API的权限有限。后台脚本可以完全访问扩展API,但无法访问网页内容。您应该阅读Chrome extension overview以及从那里链接的页面,以了解应该在哪种类型的脚本中找到哪些功能。

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

  1. 后台脚本表示后台上下文中的任何脚本。除了实际background scripts之外,还包括弹出窗口和选项页面等。但是,您可以确保始终可用于从内容脚本接收消息的唯一页面是您在background scripts中定义的实际内容的manifest.json 。由于用户与浏览器的交互,有时可能会有其他页面可用,但它们并不一致。
  2. 此答案已从duplicate question移出,然后进行了修改。

答案 2 :(得分:1)

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

  

getSelected

     

chrome.tabs.getSelected(整数windowId,函数   回调)
  自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);
});

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

result image

code image

https://developer.chrome.com/extensions/tabs#type-Tab表明了这一点 标签显示的网址。仅当扩展程序的清单包含"标签"许可。(只是为了提醒别人忘记。当我测试它时我忘了它。)

答案 3 :(得分:-3)

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

chrome.tabs.getSelected(null, function(tab){
    console.log(tab);
});