Chrome扩展程序:如何遍历所有标签页?

38

如何迭代遍历用户打开的所有标签页,并检查它们是否有一个特定的带有id = 'item'的HTML项?


2
请问您能否更新所选答案?该API现已过时。 - Andrew Rondeau
4个回答

78

3
但是这个过程如何迭代标签页?tabs 是否有一个长度方法?大多数 API 方法只需要一个单独的标签页或标签页属性,因此您需要使用类似 tabs[0]...tabs[n] 的变量对它们进行索引。如何获得n? - jiggunjer
2
@jiggunjer,n = tabs.length,tabs - 是一个数组。 - Vlas Bashynskyi
@Golden,如果您将第一个参数设置为 null 而不是 {},会发生什么? - Pacerier
新的API参考网址为https://developer.chrome.com/docs/extensions/reference/tabs/#method-query。 - mark

24
你可以这样做:
chrome.tabs.getAllInWindow(null, function(tabs){
  for (var i = 0; i < tabs.length; i++) {
    chrome.tabs.sendRequest(tabs[i].id, { action: "xxx" });                         
  }
});

照顾好您的物品之后,如果您能这样做:
document.getElementById('item')

不要忘记,你不能通过使用“背景页”来操纵HTML。所以第一段代码是用于背景页的,而第二段代码必须放在内容脚本中 ;)

你可能想要添加检查元素是否存在的代码,可以使用document.getElementById('item') != null来判断,将其保存在某个变量中,并检索以确定该元素是否存在于页面中。 - Jesus Ramos
哈哈,没问题,今天打字有点慢,还得参考我的扩展程序,确保我所写的是正确的。 - Jesus Ramos
6
正确答案应更改为 https://dev59.com/6W035IYBdhLWcg3wc_sm#15281976。 - user257319
@Sindar,为什么不直接使用tabs.query,它可以给你所有的标签页? - Pacerier
chrome.tabs.getAllInWindow已被弃用。 - Dustin Poissant

10

2022年7月修订:

这个答案最初是为MV3用户编写的。如果你正在寻找MV2的答案,请参考上面的内容。否则,这个答案在MV3中也完全适用。

原始答案

chrome.tabs.query是你要找的函数。你可以传入参数来过滤标签页。在你的情况下,你想要遍历所有打开的标签页。下面是你要找的代码的两个版本:

异步回调版本

chrome.tabs.query({}, function(tabs) {
  tabs.forEach(function (tab) {
    // do whatever you want with the tab
  });
});

承诺版本

var tabs = await chrome.tabs.query({});
tabs.forEach(function (tab) {
  // do whatever you want with the tab
});

在这两种情况下,参数tab都是一个Tab

变量tabs = await chrome.tabs.query({});不起作用。它说,“未捕获的类型错误:tabs.query(对象queryInfo,函数回调)的调用中的错误:没有匹配的签名。” - Jeff Baker
1
我上面的评论是针对Manifest V2的。在Manifest V3中可能会很好地工作。 - Jeff Baker
1
我已经更新了答案,提供了MV2用户相关的信息! - Nicolas

2
这是一个不被弃用的原始方法(截至2019年5月):

最初的回答:

chrome.tabs.query({}, function(tabs){
        tabs.forEach(tb => {
            chrome.tabs.sendMessage(tb.id, { action: "xxx" });
        });
    });

也许在五月份这个方法可行,但是现在十月份看来,你需要迭代遍历 { highlighted: true } 即当前选项卡和 { hightlighted: false } 即其他所有选项卡才能真正地遍历它们。 - Tiramonium

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接