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

chrome.tabs返回undefined,尽pipe我设置权限块的标签。

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

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

 chrome.tabs 

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

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

如果你想使用chrome.tabs然后从content_script传递消息到后台脚本,并与chrome.tabs玩。

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

如Chrome 内容脚本文档中所列,可用于内容脚本的API是[我已经放置了不推荐的方法 删除线 格式]:

  • 扩展名 ( getURL , inIncognitoContext , lastError , 根据要求 发送请求
  • 国际化
  • ( 连接 , getManifest , getURL , ID , onConnect , onMessage , sendMessage )
  • 存储

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

  • extension.onRequest
  • extension.sendRequest

尽pipe尚未正式弃用,但extension.lastError也可用作runtime.lastError 。 在这一点上,它通常被称为在那个位置:

  • extension.lastError

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

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

需要在内容脚本和后台脚本之间进行通信是很常见的。 要做到这一点,你可以使用消息传递 。 这允许您在两个脚本之间传递信息来完成仅使用一种types的脚本不可能实现的事情。 例如,在您的内容脚本中,您可能需要的信息只能从其他Chrome浏览器API中获得,或者您需要通过其他Chrome扩展API之一来完成(或只能)完成的事情。 在这些情况下,您需要使用chrome.runtime.sendMessage()向后台脚本发送消息 ,告诉它需要完成什么,同时提供足够的信息以便能够这样做。 您的后台脚本可以将所需的信息(如果有的话)返回到您的内容脚本。 或者,您将有时间处理将主要在后台脚本中完成。 后台脚本可能会注入一个内容脚本,或者只是发送一个已经注入的脚本,从页面获取信息,或者修改网页。


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

这个答案是从一个重复的问题 ,然后修改。

检查这个答案也https://stackoverflow.com/a/6718277/449345这一个为我工作;

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