当前位置:首页 > 技术 > 正文内容

构建Chrome书签分类管理插件:智能文件夹与分类编辑

访客 技术 2026年7月15日 1

本文将指导你开发一个Chrome扩展,实现书签的智能分类管理。核心功能包括:通过弹出窗口选择分类并自动创建缺失的文件夹,以及提供可编辑分类的选项页面。以下逐步分解实现细节。

1. 清单文件配置 (manifest.json)

定义扩展权限和基础结构,需要声明 bookmarksstorageactiveTabscripting 权限。

{
  "manifest_version": 3,
  "name": "书签分类管理器",
  "version": "1.0",
  "permissions": ["bookmarks", "activeTab", "storage", "scripting"],
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "images/icon16.png",
      "48": "images/icon48.png",
      "128": "images/icon128.png"
    }
  },
  "options_page": "options.html",
  "background": {
    "service_worker": "background.js"
  },
  "icons": {
    "16": "images/icon16.png",
    "48": "images/icon48.png",
    "128": "images/icon128.png"
  }
}

2. 后台服务脚本 (background.js)

当前版本核心逻辑位于popup页面,后台脚本可留空作为扩展入口。

// 此文件主要用于扩展生命周期管理,当前逻辑暂不涉及后台处理

3. 选项页面 (options.html + options.js)

提供分类列表编辑界面,支持逗号分隔输入并持久化存储。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>分类管理</title>
  <style>
    body { font-family: Arial, sans-serif; padding: 20px; }
    textarea { width: 350px; height: 180px; font-size: 18px; padding: 8px; }
    .container { max-width: 500px; margin: 0 auto; }
    button { margin-top: 15px; padding: 8px 20px; cursor: pointer; }
  </style>
</head>
<body>
  <div class="container">
    <h2>编辑分类(逗号分隔)</h2>
    <textarea id="categoryInput" placeholder="例如:AI工具,开发,学习,工作"></textarea>
    <br>
    <button id="saveBtn">保存设置</button>
  </div>
  <script src="options.js"></script>
</body>
</html>
// 默认分类列表
const DEFAULT_CATEGORIES = ['AI应用', '机器学习', '前端开发', '后端架构', '设计资源'];

document.addEventListener('DOMContentLoaded', () => {
  // 加载已有配置,若无则使用默认
  chrome.storage.sync.get('categories', ({ categories }) => {
    const list = categories || DEFAULT_CATEGORIES;
    document.getElementById('categoryInput').value = list.join(', ');
  });

  // 保存逻辑
  document.getElementById('saveBtn').addEventListener('click', () => {
    const raw = document.getElementById('categoryInput').value;
    const items = raw.split(',').map(s => s.trim()).filter(Boolean);
    chrome.storage.sync.set({ categories: items }, () => {
      alert('分类已更新');
    });
  });
});

4. 弹出窗口 (popup.html + popup.js)

实现分类选择、自动创建文件夹、收藏当前标签页的功能。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>书签收藏</title>
  <style>
    body { width: 220px; padding: 15px; font-family: Arial, sans-serif; }
    select { width: 100%; padding: 6px; margin: 10px 0; }
    button { width: 100%; padding: 8px; background: #4CAF50; color: white; border: none; cursor: pointer; }
    button:hover { background: #45a049; }
  </style>
</head>
<body>
  <h3>收藏到分类</h3>
  <select id="catSelect"></select>
  <button id="addBtn">添加书签</button>
  <script src="popup.js"></script>
</body>
</html>
document.addEventListener('DOMContentLoaded', () => {
  // 从存储中获取分类,若无则使用默认
  chrome.storage.sync.get('categories', ({ categories }) => {
    const list = categories || ['AI应用', '机器学习', '前端开发', '后端架构', '设计资源'];
    const selector = document.getElementById('catSelect');
    list.forEach(cat => {
      const opt = document.createElement('option');
      opt.value = cat;
      opt.textContent = cat;
      selector.appendChild(opt);
    });
  });

  // 添加书签逻辑
  document.getElementById('addBtn').addEventListener('click', () => {
    const selectedCategory = document.getElementById('catSelect').value;
    chrome.tabs.query({ active: true, currentWindow: true }, ([tab]) => {
      if (!tab) return;

      // 检查根目录下是否已有同名文件夹
      chrome.bookmarks.getTree(([root]) => {
        const bookmarksBar = root.children[0]; // 书签栏
        let targetFolder = null;

        // 递归查找分类文件夹
        function findFolder(nodes) {
          for (const node of nodes) {
            if (node.title === selectedCategory && node.children !== undefined) {
              targetFolder = node;
              return true;
            }
            if (node.children && findFolder(node.children)) return true;
          }
          return false;
        }
        findFolder(bookmarksBar.children);

        // 若未找到,则在书签栏创建新文件夹
        if (!targetFolder) {
          chrome.bookmarks.create({
            parentId: bookmarksBar.id,
            title: selectedCategory
          }, (newFolder) => {
            createBookmark(newFolder.id, tab);
          });
        } else {
          createBookmark(targetFolder.id, tab);
        }
      });
    });
  });

  // 在指定文件夹中创建书签
  function createBookmark(folderId, tab) {
    chrome.bookmarks.create({
      parentId: folderId,
      title: tab.title,
      url: tab.url
    }, () => {
      console.log(`已将 "${tab.title}" 收藏至分类 "${selectedCategory}"`);
      window.close(); // 完成后关闭弹出窗
    });
  }
});

5. 样式补充

可根据需求创建 popup.cssoptions.css 文件进一步美化,上述代码已内联基础样式。

此扩展演示了Chrome书签API的典型用法,实际部署前建议完善错误处理和边缘情况(如网络异常、标签页无URL等)。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。