Javascript &引用;无法读取未定义的属性";在内容脚本中使用chrome.tabs或其他chromeapi时
Javascript &引用;无法读取未定义的属性";在内容脚本中使用chrome.tabs或其他chromeapi时,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,chrome.tabs返回未定义,尽管我在权限块中设置了选项卡 "permissions": [ "tabs", "http://*/*", "https://*/*" ], "content_scripts": [ { "matches": [ "http://*/*", "https://*/*" ], "js": [ "js/myScrip
chrome.tabs
返回未定义,尽管我在权限块中设置了选项卡
"permissions": [
"tabs",
"http://*/*",
"https://*/*"
],
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"js/myScript.js"
],
"all_frames": true
}
],
但是在myScript.js中,以下返回未定义
chrome.tabs
由于内容脚本有其自身的局限性
chrome.tabs
仅在后台脚本和弹出脚本中可用
如果您想使用chrome.tabs
,请将消息从内容脚本传递到背景脚本,并使用chrome.tabs也检查此答案
这个对我有用
chrome.tabs.getSelected(null, function(tab){
console.log(tab);
});
只能有限地访问Chrome API。此访问不包括您尝试使用的API(例如,chrome.tabs
)。如果需要使用该API,则必须在1中使用
如Chrome中所列,内容脚本可用的API有[我已将不推荐的方法置于删除线格式]:
- (,,,)
- (,,,,,,)
列出的几个API已被弃用,并且已经使用了一段时间。已弃用的已移动到不同的位置(也在上面列出):
extension.onRequest
➞ 李>
extension.sendRequest
➞ 李>
虽然没有正式弃用,extension.lastError
也可以作为。在这一点上,通常指该位置:
extension.lastError
➞ 李>
将扩展划分为后台脚本和内容脚本
您需要根据每种脚本可用的功能,将代码分为需要在后台脚本中的内容和需要在内容脚本中的内容。内容脚本可以访问它们被注入的网页的DOM,但对扩展API的访问有限。后台脚本可以完全访问扩展API,但不能访问网页内容。您应该阅读,以及从那里链接的页面,以了解在哪种类型的脚本中应该包含哪些功能
通常需要在内容脚本和后台脚本之间进行通信。为此,您可以使用。这允许您在两个脚本之间通信信息,以完成仅使用一种脚本类型无法完成的任务。
例如,在您的内容脚本中,您可能需要只能从其他Chrome API之一获得的信息,或者您需要通过其他Chrome扩展API之一最合适(或只能)完成的事情。在这些情况下,您将需要在后台脚本中使用,告诉它需要做什么,同时提供足够的信息让它能够这样做。然后,后台脚本可以将所需信息(如果有)返回到内容脚本。或者,有时处理主要在后台脚本中完成。背景脚本可以注入内容脚本,或者只注入已经注入的脚本,以从页面获取信息,或者对网页进行更改
背景脚本是指背景上下文中的任何脚本。除了实际页面外,还包括弹出窗口和选项页面等。但是,您可以确保始终可以从内容脚本接收消息的唯一页面是manifest.json中定义的实际页面。由于用户与浏览器的交互,其他页面有时可能可用,但这些页面并不一致
此答案已从a移动,然后进行了修改。显示
被选中
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元素中检查结果
表明
选项卡显示的URL。此属性仅在扩展的清单中包含“tabs”权限时才存在。(仅用于提醒某人忘记了。我刚测试时忘记了它。)chrome。tabs
仅适用于扩展进程中运行的代码,例如后台、选项或弹出页面。内容脚本无法访问chrome.tabs
对象。我在后台页面中有chrome.tabs,这是一个未定义的问题!getSelected()chrome.tabs方法在chrome 33之后就被弃用了。令人困惑的是,的API文档中包含了关于使用chrome.tabs
API的说明……我投票反对这个方法,因为我从google官方API文档中得到了完全相反的文档。>chrome.tabs.getCurrent>获取进行此脚本调用的选项卡。如果从非选项卡上下文(例如:背景页或弹出视图)调用,则可能未定义。请检查:chrome.tabs总是未定义的,因为这根本不是真的<代码>chrome.tabs
在弹出脚本中未定义。只需添加-在chrome.tabs
在后台
页面中调用之前,我已尝试使用调试器
,此时我得到chrome.tabs
未定义。当我不间断地运行该代码时,它似乎工作正常(同样,仅在后台
页面中)。不,问题是tabs API在注入的内容脚本中完全不可用。getCurrent chrome.tabs.getCurrent(函数回调)获取进行此脚本调用的选项卡。如果从非选项卡上下文(例如,背景页或弹出视图)调用,则可能未定义@GregDomjanchrome.tabs
仅在后台上下文中可用。内容脚本不在后台