8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在内容脚本中使用 chrome.tabs 或其他 chrome API 时出现“无法读取未定义的属性”

Rick James 1月前

44 0

尽管我在权限块中设置了选项卡,但 chrome.tabs 仍返回未定义。\'permissions\': [ \'tabs\', \'http://*/*\', \'https://*/*\'],\'

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

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

myScript.js , chrome.tabs undefined .

帖子版权声明 1、本帖标题:在内容脚本中使用 chrome.tabs 或其他 chrome API 时出现“无法读取未定义的属性”
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Rick James在本站《javascript》版块原创发布, 转载请注明出处!
最新回复 (0)
  • dcp 1月前 0 只看Ta
    引用 2

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

    获取选定项

    chrome.tabs.getSelected(整数窗口Id,函数回调)
    自 Chrome 33 起已弃用。请使用 tabs.query {active: true}。
    获取在指定窗口中选择的选项卡。

    也许你应该 像这样 popup.js

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

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

    结果图像

    代码图像

    https://developer.chrome.com/extensions/tabs#type-Tab 显示 选项卡显示的 URL。仅当扩展的清单包含 \'tabs\' 权限时,此属性才会出现。 (只是为了提醒有人忘记了。我刚刚测试时就忘记了。)

  • 我在页面顶部看到了该声明,但我指的是 @GregDomjan 引用的页面部分所造成的混淆。我认为我正在寻找的答案(其他人也正在寻找)是为了解决我所描述的明显矛盾,即该引文中的“此脚本调用”一词指的是内容脚本以外的其他脚本。尽管它明确排除了引文中的背景页面和弹出视图,并排除了页面顶部的内容脚本,但它隐含地指的是哪些脚本并不明显。感谢您添加澄清。

  • Von 1月前 0 只看Ta
    引用 4

    @AdamSpiers 没有矛盾。chrome.tabs 文档页面顶部非常明确地指出“注意:Tabs API 可由服务工作线程和扩展页面使用,但不能由内容脚本使用”。因此,该页面上的所有内容均排除了内容脚本上下文。我已编辑此答案以添加一个部分,专门介绍文档中这些语句引起的混淆。

  • CMS 1月前 0 只看Ta
    引用 5

    @Makyen 那是文档中的直接引述,而您却在反驳。文档至少从表面上看似乎是错误的,但它有助于承认和解决(明显的)矛盾。

  • @GregDomjan chrome.tabs 仅在后台上下文中可用。内容脚本不在后台上下文中,因此没有可用的 chrome.tabs。可以在选项卡中打开扩展程序中的 HTML 页面。最常见的是选项页面,但您也可以有其他页面。这些页面将处于后台上下文中,并具有与之关联的选项卡,可以从 chrome.tabs.getCurrent() 获取。

  • getCurrent chrome.tabs.getCurrent(function callback) 获取此脚本调用所在的选项卡。如果从非选项卡上下文(例如,背景页面或弹出视图)调用,则可能未定义。developer.chrome.com/extensions/tabs#method-getCurrent

  • Olie 1月前 0 只看Ta
    引用 8

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

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

    他们可以直接访问以下扩展 API:

    • 国际化
    • 贮存
    • 运行时.connect()
    • 运行时.getManifest()
    • 运行时.getURL()
    • 运行时标识
    • 运行时.onConnect
    • 运行时.onMessage
    • 运行时.sendMessage()

    特别针对 chrome.tabs

    对于 ,还有额外的困惑 chrome.tabs 。人们通常认为,因为它 .tabs 和内容脚本都在选项卡中,所以 chrome.tabs 在内容脚本中可用,但事实并非如此。

    chrome.tabs 文档页面 chrome.tabs documentation page 显示:

    注意:服务工作线程和扩展页面可以使用 Tabs API,但不能用于内容脚本。

    特别令人困惑的是 chrome.tabs.getCurrent()

    文档 chrome.tabs.getCurrent() 混淆 更加严重了

    获取此脚本调用所在的选项卡。如果从非选项卡上下文(例如,背景页面或弹出视图)调用,则返回未定义。

    许多人认为提到“非选项卡上下文(例如,背景页面或弹出视图)”是指非背景上下文,但文档中具体指的是 实际的 背景页面,而不是背景上下文中的任何内容。它的意思是,为了返回选项 tab ,需要从背景上下文和选项卡上下文中的脚本调用它。如果它是从背景上下文中的脚本调用的,但不是在选项卡上下文中,那么它将返回 undefined 。它不适用于内容脚本上下文。尝试从内容 chrome.tabs.getCurrent() 脚本上下文调用将导致

    未捕获的类型错误:无法读取未定义的属性

    这是该问题所询问的错误。

    将你的扩展程序划分为后台脚本和内容脚本

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

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


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

    This answer was moved from a 重复的问题 , and then modified.

  • @VicX 你说得对,但 Chrome 开发者文档经常过时或不正确。这可能是其中一种情况。

  • 我投了反对票,因为我从谷歌官方 api 文档中得到了完全相反的文档。>chrome.tabs.getCurrent>获取此脚本调用所在的选项卡。如果从非选项卡上下文调用(例如:背景页面或弹出视图),则可能未定义。请检查:developer.chrome.com/extensions/tabs#method-getCurrent

  • 内容脚本的 API 文档包含有关使用 chrome.tabs API 的说明,这有点令人困惑……

  • 内容脚本 只能使用 chrome. i18n 、chrome. dom 、chrome. storage 和 chrome 的子集。/chrome runtime . extension .

    大多数 chrome API chrome.tabs 仅适用于后台脚本(MV3 中的服务工作者)、弹出脚本等。

    解决方案

    将消息 从内容脚本传递到 后台脚本 并在那里使用 API。

  • 仅适用于在扩展程序进程中运行的代码,例如后台、选项或弹出页面。内容脚本无法访问

返回
作者最近主题: