系列文章可以查看《浏览器扩展程序开发笔记》专栏
书签是指将网址收藏在浏览器的收藏夹中,便于日后再访问。可以通过点击浏览器地址栏右侧的星型图标 ⭐️ 将当前网页收藏起来;在地址栏输入 chrome://bookmarks/
打开书签管理器,可以对书签进行批量操作管理。
💡 如果开发书签相关的扩展程序,还可以考虑 Override Pages 覆写书签管理页面,以提供更多样的功能。
在浏览器中,众多的书签是以树型数据结构进行存储管理的,该数据结构中的基本单位是节点 BookmarkTreeNode,它有两种类型:
- 书签 bookmark,它是叶子节点,即其下没有再细分的子节点
- 文件夹 folder,也称作组 group,在其下可以包含子节点
Chrome 提供以 chrome.bookmarks
为前缀的 API,它们是与书签相关方法。
💡 在使用相关 API 时需要在扩展出现的配置清单 manifest.json
的配置项 permissions
中声明 bookmarks
权限。
这些方法里会常用到或一般返回**书签节点对象 BookmarkTreeNode**,它包含以下常用的属性:
children
数组(可选,当节点是书签时就没有该属性),一个包含了子节点的数组dateAdded
数值(可选),节点创建的时间,以毫秒为计算单位,可以通过方法new Date(dateAdded)
获取 JS Date 对象dateGroupModified
数值(可选),如果节点是文件夹时,该数值表示文件夹内容修改的最后时间点id
字符串,它是节点的唯一标识符,在浏览器的书签「树」中每一个节点的 ID 都是唯一的index
数值(可选),该节点在其父文件夹中的排序,索引从0
开始parentId
字符串(可选,当节点是根文件夹时,没有该属性)url
字符串(可选,当节点是书签时具有该属性,点击该书签会导航到指定的网页地址)
打开书签
使用方法 chrome.bookmarks.get(idOrIdList: string | string[])
获取特定的书签节点,或多个书签节点组成的数组,它是一个异步函数,立即返回的是一个 Promise
,最终返回的是相应的书签节点 BookmarkTreeNode(或数组)。
// 借助 Chrome 提供的 API,封装一个打开书签的方法
// 该方法接收三个参数
// * 第一个参数是所需打开的书签节点的 ID 值
// * 第二个参数是打开的模式,可以是 new 或 current,分别是指在新建标签页打开书签,或在当前标签页打开书签
// * 第三个参数是对于新增标签页的情况,是否将该标签页设置为当前激活标签页
const openBookmark = (nodeId, mode = 'new', active = true) => new Promise((resolve, reject) => {
// 根据节点 ID 获取书签
chrome.bookmarks.get(nodeId)
.then(async (nodes) => {
const { url } = nodes[0];
// 根据参数判断以哪一个标签页打开书签
let tab;
if (mode === 'new') {
// open on new tab
tab = await createNewTab(active);
} else if (mode === 'current') {
// open on current active tab
tab = await getActiveTab();
}
// 通过更新标签页的属性 URL 的方式打开书签
await chrome.tabs.update(tab.id, {
url,
});
resolve(tab);
});
});
const createNewTab = async (active = true) => {
const newTab = await chrome.tabs.create({
active,
});
return newTab;
};
const getActiveTab = async () => {
// 匹配条件是 currentWindow 当前窗口的 active 激活的标签页
// 由于该方法返回的是一个数组,但是激活的标签页只有一个,因此可以使用解构获取该数组唯一的一个元素
const [tab] = await chrome.tabs.query({
active: true,
currentWindow: true,
});
return tab;
};
创建书签
使用方法 chrome.bookmarks.create(bookmark: CreateDetails)
创建一个书签节点,它可以是一个书签或一个文件夹(如果入参的配置对象省略了属性 url
或该属性值为 NULL
),它是一个异步函数,立即返回的是一个 Promise
,最终返回的是书签节点 BookmarkTreeNode。
该方法接受一个配置对象作为入参,该对象常用属性如下:
index
数值(可选),指定新增的书签节点在其父节点中的排序parentId
字符串(可选),指定新增的书签是在哪一个父节点之下,默认是以 📁Other bookmarks
其他书签文件夹作为父节点title
字符串(可选),书签节点的名称url
字符串(可选),书签节点的网址(如果新增的节点是文件夹时,省略该属性)
由于书签以树型数据结构进行存储管理,因此创建书签节点时,需要向上述方法传递配置对象,指定新增的节点是在哪一个父节点之下的
// 在文件夹 bookmarkBar 之下,新增一个名为 new folder 书签节点,它是一个文件夹
chrome.bookmarks.create({
'parentId': bookmarkBar.id,
'title': 'new folder'
}).then(folder => {
console.log("added folder: " + newFolder.title);
})
// 新增一个书签,名称为 Google
chrome.bookmarks.create({
'parentId': FolderId,
'title': 'Google',
'url': 'https://www.google.com.hk/',
});