如何使用 chrome.tabs.getCurrent 在 Chrome 扩展程序中获取页面对象?

Posted

技术标签:

【中文标题】如何使用 chrome.tabs.getCurrent 在 Chrome 扩展程序中获取页面对象?【英文标题】:How do you use chrome.tabs.getCurrent to get the page object in a Chrome extension? 【发布时间】:2011-10-06 18:58:33 【问题描述】:

该代码旨在将用户正在查看的页面的当前选项卡对象输出到控制台,但它只是输出未定义的。它在浏览器操作页面中运行。

chrome.tabs.getCurrent( function(tab)
    console.log(tab);
 );

我查看了documentation,据我所知,代码似乎与它所说的相符。

【问题讨论】:

浏览器操作弹出页面不属于任何选项卡,因此tabs.getCurrent() 将不起作用。相反,serg 对tabs.getSelected() 的回答应该可以解决问题。 【参考方案1】:

getSelected() 方法自 Google Chrome 16 起已被弃用(但官方文档中的许多文章尚未更新)。 Official message is here。要获取在指定窗口中选择的选项卡,请使用 chrome.tabs.query() 和参数 'active': true。所以现在它应该是这样的:

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

【讨论】:

这总是在回调中返回0长度数组( 如果在一个桌面上我打开了 2 个 chrome 窗口,每个窗口都显示一个选项卡,在这种情况下是否可以有 >1 个活动选项卡? @lsheng : 是的,所以使用currentWindow: true 来限制它(或遍历它们) 那么为什么chrome.tabs.getCurrent 不能在 OP 的代码中工作呢?这也是我的问题。 仍然相关...... 7 年后我不知道他们为什么不更新他们的文档【参考方案2】:

试试:

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

【讨论】:

已弃用,请参阅下面@konstantin 的答案。 getCurrent() 与已弃用的getSelected() 或下面的答案几乎不同,第一种方法从脚本运行的位置获取选项卡,而第二种方法获取当前选择的(活动)标签 如何获取innerhtml【参考方案3】:

由于chrome.tabs 仅在后台或弹出脚本中可用,并且后台脚本在任何选项卡中均无效,因此chrome.tabs.getCurrent() 始终返回undefined

相反,我们可以从任何消息侦听器回调的第二个参数中检索活动的Tab 对象。例如,

browser.runtime.onMessage.addListener((message, sender) => 
  console.log('Active Tab ID: ', sender.tab.id);
);

【讨论】:

这是唯一对我有用的!!!非常感谢!【参考方案4】:

如果从非选项卡上下文(例如,背景页面或弹出视图)调用,则可能未定义。

看来您不应该在bg.js 中使用此代码,而应该在cs.js 中使用。

【讨论】:

欢迎来到 SO,我们感谢您的意见。请客气一点,再具体一点,我不确定引号是干什么用的 - 请提及您引用的对象还有:什么是 this 代码。请编辑您的问题。 它来自谷歌官方文档 chrome.tabs。 developer.chrome.com/extensions/tabs#method-getCurrent。不幸的是,我在cs.js中试过了,还是不行。这是一个错误哈哈 这更像是您可以从具有浏览器选项卡的页面调用它。例如:选项页面。【参考方案5】:

如果您遇到这个问题,可能是因为在错误的地方使用了chrome.tabs.getCurrent()。 您 can't 在内容脚本中使用 chrome.tabs。 但您可以在backgroundoptions 脚本中使用它。

由于使用了 Promises,此示例需要 Manifest。此外,内容脚本不能使用 tabs.query。

【讨论】:

以上是关于如何使用 chrome.tabs.getCurrent 在 Chrome 扩展程序中获取页面对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?