[js] 闪卡 JS 分享(方便在数据库上制作闪卡)

image.png

(() => { // 块菜单配置 const menus = [ { name: "快速制卡", operation: "add", }, { name: "取消制卡", operation: "remove", } ]; // 监听块右键菜单 whenElementExist('#commonMenu .b3-menu__items').then((menuItems) => { const menusReverse = menus.reverse(); observeBlockMenu(menuItems, async (isTargetMenu) => { if (menuItems.querySelector('.operate-my-card')) return; const addAv = menuItems.querySelector('button[data-id="addToDatabase"]'); if (!addAv) return; if (menus.length === 0) return; // 生成块菜单 menusReverse.forEach((menu, index) => { const menuText = menu.name; const menuIcon = '#iconRiffCard'; const menuClass = `operate-my-card-${menus.operation}-${menus.length - index - 1}`; const menuButtonHtml = `<button class="b3-menu__item ${menuClass}"><svg class="b3-menu__icon " style=""><use xlink:href="${menuIcon}"></use></svg><span class="b3-menu__label">${menuText}</span></button>`; addAv.insertAdjacentHTML('afterend', menuButtonHtml); const menuBtn = menuItems.querySelector('.' + menuClass); // 块菜单点击事件 menuBtn.onclick = async () => { window.siyuan.menus.menu.remove(); menuItemClick(menu.operation); }; }); }); }); // 菜单点击事件 async function menuItemClick(operation) { let blocks = []; const selectedRows = document.querySelectorAll('.av__row.av__row--select'); // 遍历每个选中的行 selectedRows.forEach(row => { // 查找当前行下 data-type 为 block-ref 的元素 const blockRefNodes = row.querySelectorAll('[data-type="block-ref"]'); // 遍历这些元素,提取 data-id blockRefNodes.forEach(node => { const dataId = node.dataset.id; if (dataId) { blocks.push(dataId); } }); }); if (operation === 'remove') { await removeFlashcard(blocks); } else { await addFlashcard(blocks); } } // 快速制卡 async function addFlashcard(blockIds) { blockIds = typeof blockIds === 'string' ? [blockIds] : blockIds; const result = await requestApi("/api/riff/addRiffCards", { "blockIDs": blockIds, "deckID": "20230218211946-2kw8jgx" }); if (!result || result.code !== 0) console.error(result); } async function removeFlashcard(blockIds) { blockIds = typeof blockIds === 'string' ? [blockIds] : blockIds; const result = await requestApi("/api/riff/removeRiffCards", { "blockIDs": blockIds, "deckID": "20230218211946-2kw8jgx" }); if (!result || result.code !== 0) console.error(result); } async function requestApi(url, data, method = 'POST') { return await (await fetch(url, { method: method, body: JSON.stringify(data || {}) })).json(); } /** * 监控 body 直接子元素中 #commonMenu 的添加 * @returns {MutationObserver} 返回 MutationObserver 实例,便于后续断开监听 */ function observeBlockMenu(selector, callback) { let isTargetMenu = false; // 创建一个 MutationObserver 实例 const observer = new MutationObserver((mutationsList) => { // 遍历所有变化 for (const mutation of mutationsList) { // 检查是否有节点被添加 if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { // 遍历所有添加的节点 mutation.addedNodes.forEach((node) => { // 检查节点是否是目标菜单 if (isTargetMenu) return; // if (menuItems.querySelector('.add-to-my-av')) return; if (node.nodeType === 1 && node.closest('[data-id="fields"]')) { isTargetMenu = true; // } else if (node.nodeType === 1 && node.closest('[data-id="fields"]')) { // isTargetMenu = true; } if (isTargetMenu) { callback(isTargetMenu); setTimeout(() => { isTargetMenu = false; }, 200); } }); } } }); // 开始观察 body 的直接子元素的变化 observer.observe(selector || document.body, { childList: true, // 监听子节点的添加 subtree: false, // 仅监听直接子元素,不监听子孙元素 }); // 返回 observer 实例,便于后续断开监听 return observer; } // 等待元素出现 function whenElementExist(selector, node) { return new Promise(resolve => { const check = () => { const el = typeof selector === 'function' ? selector() : (node || document).querySelector(selector); if (el) resolve(el); else requestAnimationFrame(check); }; check(); }); } }) ();
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    27061 引用 • 113095 回帖 • 2 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    237 引用 • 1708 回帖
3 操作
Cavendish 在 2025-06-06 23:34:46 更新了该帖
Cavendish 在 2025-06-06 23:31:15 更新了该帖
JeffreyChen 在 2025-06-06 23:07:27 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
请输入回帖内容 ...
Cavendish
理论是灰色的,而生命之树长青 成都

推荐标签 标签

  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 453 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖 • 1 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 597 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 51 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    500 引用 • 1396 回帖 • 251 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    8 引用 • 37 回帖
  • Anytype
    3 引用 • 31 回帖 • 44 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    101 引用 • 905 回帖 • 2 关注
  • CodeMirror
    2 引用 • 17 回帖 • 181 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 242 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1062 引用 • 3455 回帖 • 136 关注
  • 导航

    各种网址链接、内容导航。

    45 引用 • 177 回帖 • 1 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    59 引用 • 22 回帖 • 2 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 232 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 18 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 43 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 641 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 641 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖 • 2 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    39 引用 • 167 回帖
  • 倾城之链
    23 引用 • 66 回帖 • 180 关注
  • gRpc
    11 引用 • 9 回帖 • 103 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    173 引用 • 1549 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖