Chrome 插件选项卡

一、前面的话chrome插件之从0到1chrome插件之通信(V3版)chrome插件之manifest配置chrome插件之玩转action1.能力一款浏览器

大家好,关于Chrome 插件选项卡很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

Tabs API 只能在后台脚本、选项脚本、弹出脚本和chrome 创建的选项卡中访问。无法在内容脚本中访问和使用它。

也就是说,chrome有选择地将不同的chrome对象注入到不同的脚本环境中,从而导致提供的API存在差异。

这张图展示了我们在特定环境下可以通过chrome.tabs访问的所有API。这些是chrome内置的为我们提供给开发者的功能。

2.权限

但使用以下API时,需要添加相关配置后才能使用,例如:

如果您希望能够动态地向指定选项卡注入并执行脚本,或者注入或删除某种CSS 样式,那么您可能需要使用这些API: chrome.tabs.executeScript() //注入段落编写脚本并执行

chrome.tabs.insertCss() //注入css样式

chrome.tabs.removeCss() //删除css 样式

{

//manifest.json ‘host_permissions’:[ ‘all_urls’ ] //支持正则匹配

}

二、API

接下来我们通过案例来一一了解,感受各个API的具体行为以及使用条件、注意事项等。

1. 创建

我们可以使用这个API来创建一个新选项卡。该选项卡与普通站点不同,属于插件所属页面。因此支持跨域请求,获取chrome提供的更多方法。

//背景.js

chrome.runtime.onInstalled.addListener(({原因})={

if (原因===’安装’) {

chrome.tabs.create({

url: ‘newtab.html’ //后台脚本相对路径中需要有newtab.html文件。

});

}

});

上面的脚本意味着插件第一次安装完成后,会立即创建一个新的标签页,所以如果我们想随时创建新的标签页,就可以使用这个API。业界很多插件都工作大多数平台都会创建新的标签页来工作,比如著名的代理插件SwitchySharp

默认支持此API,不需要额外的清单配置。

2. 查找

我们可能有获取当前浏览器窗口处于活动状态的标签页的需求,因为对于同一个窗口,存在且只有一个标签页显示在用户面前。我们将这样的选项卡称为活动状态。这时候我们就需要用到下面的API。

异步函数getCurrentTab() { let queryOptions={ active: true };让[tab]=等待chrome.tabs.query(queryOptions);返回选项卡; }

通过调用上述方法,可以获得当前窗口中激活的选项卡的实例对象。从这个对象中,你可以获取对应选项卡的唯一id、url、icon等信息。

值得注意的是,如果Chrome浏览器打开了多个窗口,则意味着每个窗口中可能存在一个激活的选项卡,因此我们获取到的选项卡将会是多个。这个时候,如果我们只解构第一种可能,那就不够严谨了。

所以我们可以通过添加搜索条件来更准确地搜索:

异步函数getCurrentTab() {

让查询选项={

active: true, currentWindow:true

};

让[tab]=等待

chrome.tabs.query(queryOptions);

返回选项卡;

}

通过添加参数currentWindow,意味着只搜索脚本运行的窗口中激活的选项卡。这时候只会找到唯一的tab,解构第一个就不会出现问题了。

除了以上搜索条件外,您还可以选择以下条件:

范围

类型

影响

积极的

布尔值

是否活跃?

可听见的

布尔值

是否正在播放音频

当前窗口

布尔值

是在脚本所在的窗口内吗?

组ID

数字

是在某个群体内吗?

突出显示

布尔值

是否处于高亮状态?

指数

数字

窗口中从左到右的索引选项卡

固定的

布尔值

是否处于固定状态?

地位

卸载/装载/完成

匹配选项卡的状态是状态的选项卡

标题

细绳

将选项卡的标题与该标题的选项卡相匹配

网址

细绳

与tab匹配的url就是url的tab

窗口ID

数字

特定窗口中的选项卡

窗口类型

正常/弹出/面板/应用程序/devtools

位于特定窗口类型下的选项卡

被固定是指在标签上右键单击时,那些标签被固定在左侧,并且可以固定多个标签。

3.发送消息

我们可以轻松地将消息发送到指定的选项卡。一般来说,我们可以在内容脚本中监听消息,并在收到消息后执行不同的业务逻辑。

chrome.tabs.sendMessage(

tabId: number, //目标选项卡的id

message: any, //发送消息

options? object, //其他配置项

callback? function, //回调函数)

以上是V3版本插件使用的。在V2版本中我们使用chrome.tabs.sendRquest()

//在v3 版本中已弃用

chrome.tabs.sendRequest(

tabId: number, //目标选项卡的id

request: any, //发送信息

callback? function, //回调函数

Chrome 插件选项卡

4.修改

如果我们想要修改某个选项卡的一些参数信息,我们可以选择使用以下API:

chrome.tabs.update( tabId? 数字, updateProperties: 对象, 回调? 函数, )

updateProperties的值与上面提到的queryOptions的属性一致。例如,我们可以动态更改指定选项卡的标题、url、固定等状态属性!

5.缩放比

当我们按住Ctrl并滑动鼠标滚轮时,我们可以调整页面的缩放比例。这可能大家都很熟悉,但实际上,这也可以通过插件提供的API来动态调整。

chrome.tabs.setZoom( tabId? number, ZoomFactor: number, //缩放比例回调? function, )

6.移动/移除/刷新

我们引入的第一个API 展示了如何创建新选项卡。默认情况下,它将创建在最后面,即最右侧。如果我们对这个放置位置不满意,也可以放置在我们想要的位置。

移动

chrome.tabs.move(

tabIds: 号|数字[],

moveProperties: 对象,

回调?函数,

type moveProperties={ index?number, //要移动到的索引索引位置。 `-1` 移动到窗口末尾。

windowId?number //要移动到的窗口id

}

消除

chrome.tabs.remove( tabIds: 数字| 数字[], 回调? 函数, )

刷新

chrome.tabs.reload( tabId? number, reloadProperties? object, callback? function, ) type reloadProperties={bypassCache?boolean //是否绕过本地缓存。默认情况下不绕过,即使用本地缓存。 }

7.导航

我们可以通过插件控制tab的前后移动(如果都有跳转记录的话)

chrome.tabs.goBack( //返回到最近的历史记录tabId? number, callback? function, ) chrome.tabs.goForward( //转到下一条历史记录,如果有一个tabId? number ,回调?函数,)

当我们打开很多标签时,浏览器会有一个小的优化。对于一些长时间没有使用的选项卡,浏览器会清除其在内存中的状态存储,所以当我们再次激活它时,它会Reload!这个流程插件还提供了API来帮助我们做:

9.分组

如果我们想将某些具有相似特征的网站归为一组,以便在视图中能够更好地注意到它们,那么我们可以通过插件提供的API来实现:

第1 步:筛选出要分组到同一组中的选项卡

const tabs=等待chrome.tabs.query({ url: [ ‘https://developer.chrome.com/*’], });

根据前面的知识,我们很容易知道tabs是域名以“developer.chrome.com”开头的所有站点的选项卡集合;

第2 步:将他们分组

const tabIds=tabs.map(({ id })=id); const 组=等待chrome.tabs.group({ tabIds });

如上图所示,所有符合条件的站点都被划分到同一组中。该API的使用方法是:

chrome.tabs.group( options: GroupOptions, callback? function, ) type GroupOptions={ tabIds?number[], //要分组的选项卡ID 集合groupId?number, //现有组createProperties?{ windowId?number //您希望在哪个窗口中创建组?默认是脚本所在的窗口} }

附加字数:

如果我们想添加样式或字体作为组的标记,我们也可以这样做:

//第一步:在manifest.json中添加“tabGrpups”的权限{ . ‘permissions’:[ ‘tabGroups’ ] } //第二步: chrome.tabGroups.update(group, { title: ‘This is第1 组’ , color:’red’ });

您可以修改该组的一些特征。上面是添加标题。效果如下:

三、实战

上面我们已经介绍了基本的API。接下来我们通过一些案例来实际体验一下各个API的作用:

准备以下物品:

清单.json

{

‘名称’: ‘选项卡演示’,

‘描述’: ‘选项卡演示’,

‘版本’: ‘1.0’,

‘清单版本’: 3,

‘行动’: {

‘default_popup’: ‘popup.html’,

“默认图标”:

{

’16’: ‘/images/get_started16.png’,

’32’: ‘/images/get_started32.png’,

’48’: ‘/images/get_started48.png’,

‘128’:’/images/get_started128.png’

}

},

‘内容脚本’: [

{

‘js’: [‘内容.js’],

‘匹配’: [‘all_urls’] } ],

‘背景’:

{

‘service_worker’: ‘background.js’

},

‘图标’: {

’16’: ‘/images/get_started16.png’,

’32’: ‘/images/get_started32.png’,

’48’: ‘/images/get_started48.png’,

‘128’:’/images/get_started128.png’

},

‘permissions’: [‘tabs’, ‘tabGroups’] }

内容.js/背景.js

//content.js 让color=”; console.log(‘content.js’); chrome.runtime.onMessage.addListener((message, sender, sendResponse)={ color=document.body.style.color; document .body.style.background=message; sendResponse(‘changed’); }); //background.js console.log(chrome);

新标签页.html

!DOCTYPE html html lang=’en’ head meta charset=’UTF-8’/meta name=’viewport’ content=’width=device-width, initial-scale=1.0’/titlechrome plugin/title /head body h1i 是chrome插件创建的页面/h1 /body /html

弹出窗口.html

弹出窗口.js

document.getElementById(‘create-tab’).addEventListener(‘click’, ()={ chrome.tabs.create({ url: ‘newtab.html’, //相对路径中需要有newtab.html后台脚本文件}) });让制表符=[]; const getSelect=(列表)={ const yes=列表[0];常量否=列表[1]; if (yes.checked) { return yes.defaultValue===’1′; } if (no.checked) { return no.defaultValue===’1′;返回假; }; document.getElementById(‘query-tab’).addEventListener(‘click’, async ()={ const active=getSelect(document.getElementsByName(‘isActive’)); const currentWindow=getSelect( document.getElementsByName(‘isCurrentWindow’) ); const pinned=getSelect(document.getElementsByName(‘pinned’)); const url=document.getElementById(‘url’).value; const title=document.getElementById(‘title’).value; getElementById(‘index’).value; const queryOptions={ active, currentWindow, pinned, } ; if (url) { queryOptions.url=url; } if (title) { queryOptions.title=title; queryOptions.index=index – 0; } console.log(queryOptions); const tabs=wait chrome.tabs.query(queryOptions); document.getElementById(‘搜索结果’).innerHTML=JSON.stringify( tabs.map( ({ id })=({ id })) ); 选项卡=选项卡}) ; document.getElementById(‘send-btn’).addEventListener(‘click’, async ()={ const color=document.getElementById(‘send-value’).value; const [tab]=wait chrome.tabs.query ( { active: true, currentWindow: true }); const response=wait chrome.tabs.sendMessage(tab.id, color); console.log(color, response); const getCurrentTab=async ()={ const [tab ]=wait chrome.tabs.query({ active: true, currentWindow: true });返回选项卡.id; }; document.getElementById(‘move’).addEventListener(‘click’, async ()={ const index=document.getElementById(‘move-index’).value – 0; const tabIds=wait getCurrentTab(); chrome.tabs.移动(tabIds,{索引}); document.getElementById(‘remove’).addEventListener(‘click ‘, async ()={ const tabIds=wait getCurrentTab(); chrome.tabs.remove(tabIds); }); document.getElementById(‘reload’).addEventListener(‘click’, async ()={ const tabId=wait getCurrentTab(); chrome.tabs.reload(tabId); }); document.getElementById(‘discard’).addEventListener(‘click’, async ()={ const tabId=document.getElementById(‘discard-value’) .value – 0; chrome.tabs.discard(tabId); }); document.getElementById(‘duplicate’).addEventListener(‘click’, async ()={ const tabId=wait getCurrentTab(); chrome.tabs.duplicate (tabId); }); document.getElementById(‘zoom-btn’).addEventListener(‘click’, async ()={ const tabId=wait getCurrentTab(); const ZoomFactor=document.getElementById(‘zoom’).value – 0; chrome.tabs. setZoom(tabId, ZoomFactor); }); document.getElementById(‘group’).addEventListener(‘click’, async ()={ const tabIds=Tabs.map(({ id })=id); const title=document.getElementById(‘group-title’).值; const group=等待chrome.tabs.group({ tabIds }); document.getElementById(‘goForward’).addEventListener(‘click’, async ()={ const tabId=wait getCurrentTab(); chrome.tabs.goForward(tabId); }); document.getElementById(‘goBack’).addEventListener(‘click’, async ()={ const tabId=wait getCurrentTab(); chrome.tabs.goBack(tabId); });

我会将以上资源放在github上。您可以下载并直接在自己的浏览器中运行以检查效果。如果您发现有用的东西,我希望您给他们一颗星!

以下是我本地测试的结果:

创建页面/发送消息

询问

删除/修改/更新

团体

有了以上武器,就可以玩Tab了!让我们一起开始开发chrome插件吧!

四、最后的话

以下是我的其他文章,欢迎阅读

保姆级讲解JS精度损失问题(图文结合)

什么是shell、bash、zsh、powershell、gitbash 和cmd?

从0到1开发浏览器插件(简单易懂)

用户评论

Chrome 插件选项卡
江山策

真的太实用啦!我一直困扰着很多标签页无法集中管理,这个chrome插件简直是我拯救世界的利器!整理标签页超方便,而且还能自定义分组和设置提醒,简直绝了!

    有15位网友表示赞同!

Chrome 插件选项卡
君临臣

我之前就用过类似的插件,但是chrome plugins 之tabs 的界面对我来说更直观易懂。很喜欢自动分类的功能,可以有效减少查找网页的时间成本。

    有7位网友表示赞同!

Chrome 插件选项卡
别留遗憾

我是个习惯性打开一堆标签页的人,结果往往导致内存占用过高!这款程序能帮我更好地管理标签页,真是太棒了,告别浏览器崩溃的烦恼!

    有20位网友表示赞同!

Chrome 插件选项卡
相知相惜

用 chrome plugins 之tabs 一段时间后,发现它确实可以提升效率。特别是“一键关闭所有不必要的标签页”的功能,简直是福音啊!以前手动点击要浪费好长时间。

    有8位网友表示赞同!

Chrome 插件选项卡
|赤;焰﹏゛

感觉有些插件的功能设置有点复杂,需要花点时间去学习才能完全利用它的功能呢!但总体来说还是比较棒的,能够有效地帮助我管理浏览器页面。

    有5位网友表示赞同!

Chrome 插件选项卡
青楼买醉

这个插件的功能确实挺实用的,比如可以自定义关键词来自动分类标签页,这让我节省了很多时间。而且支持多个分组管理,感觉使用起来很灵活。

    有20位网友表示赞同!

Chrome 插件选项卡
抚笙

这款插件虽然好用,但是我的习惯是使用多窗口浏览网页,如果能够支持多窗口标签页管理就好了,那样就更完美了!

    有19位网友表示赞同!

Chrome 插件选项卡
有一种中毒叫上瘾成咆哮i

我试了一下chrome plugins 之tabs ,发现它只能在同一个浏览器窗口内有效。我经常会在不同的窗口间切换浏览页面,希望将来能扩展到多窗口管理的功能。

    有16位网友表示赞同!

Chrome 插件选项卡
雨后彩虹

对于经常需要快速定位某个网页的人来说,这款插件非常实用!标签页预览功能真的很方便,可以一目了然地看到每个标签页的内容!

    有6位网友表示赞同!

Chrome 插件选项卡
。婞褔vīp

刚安装使用 chrome plugins 之tabs ,发现有些操作步骤还是蛮复杂的,希望开发者能简化一下界面,更容易上手。

    有6位网友表示赞同!

Chrome 插件选项卡
千城暮雪

我用的系统比较老,可能导致插件运行速度有点慢,不知道是不是我的电脑配置太低了。不过功能上来说很不错。

    有18位网友表示赞同!

Chrome 插件选项卡
败类

试用了一个星期左右, chrome plugins 之tabs 确实可以帮我更好地管理浏览器标签页面!特别是“标签页分组”和“自动分类”两个功能非常强大!

    有19位网友表示赞同!

Chrome 插件选项卡
毒舌妖后

这个插件的功能对我来说还比较多余,我更喜欢使用书签或历史记录来管理网页。如果开发出更精简的版本就好了。

    有17位网友表示赞同!

Chrome 插件选项卡
素颜倾城

这个插件的功能确实很多,但是感觉有些过于复杂了,希望开发者能够针对不同用户的需求设计更简洁的界面和功能设置!

    有19位网友表示赞同!

Chrome 插件选项卡
我的黑色迷你裙

之前一直用其他插件管理标签页都感觉不够完美,直到我使用上了chrome plugins 之tabs 我才觉得它才是真正优秀的浏览器辅助工具!强烈推荐给需要整理网页的朋友们!

    有6位网友表示赞同!

Chrome 插件选项卡
各自安好ぃ

这款插件的功能真的很强大,特别是“一键关闭所有同一网站的标签页”功能真的太赞了!之前总是在打开同一个网站的时候弄乱了一堆页面,现在一切都轻松自如!

    有17位网友表示赞同!

Chrome 插件选项卡
代价是折磨╳

我觉得chrome plugins 之tabs 的功能设计很有创新性,可以有效地提高浏览器使用效率。 不过对于一些经常需要查看历史记录的用户来说,能不能添加一个与历史记录同步的功能呢?

    有14位网友表示赞同!

Chrome 插件选项卡
病态的妖孽

这款插件总体让我感觉比较满意,它能有效帮我管理标签页,节省时间和精力!希望能继续开发更强大且更人性化的功能!

    有11位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/129601.html

(0)
小su's avatar小su
上一篇 2024年9月2日 上午2:55
下一篇 2024年9月2日 上午2:59

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注