求助 js 代码,左键展开文档树,中键打开文档

思源假子文件夹插件 视频教程 - 链滴

一个小建议:能否在打开页面的同时,自动展开该页面的子页面 - 链滴

点击展开文档树 - 链滴

可以通过 JS 代码实现鼠标中键展开文档吗? - 链滴

基于以上帖子及下面的“中键展开文档树”的代码,哪位大佬能帮忙写一个 js 代码,实现以下功能:

如果当前文档下面含有子文档:

  1. 鼠标左键文档树条目,展开文档树(显示该文档下的子文档),不打开文档
  2. 鼠标中键文档树条目,不展开文档树,打开文档(原左键的默认功能)

先感谢 @zxkmm,@Undii,@wilsons 等大佬的相关插件、代码和热心帮助!

// 中键展开文档树:基于https://ld246.com/article/1682476267736
(function(){
    let g_reset = setInterval(main, 2000);

    function main() {
        if (document.querySelector('.sy__file')) {
            clearInterval(g_reset);
        }else{
            return false;
        }
        document.querySelector('.sy__file').addEventListener('mousedown', event => {
            if (event.button != 1) return;
            let notTitleFlag = false;
            if (!event.target.classList.contains('b3-list-item__text')) notTitleFlag = true;
            let target = event.target.parentNode;
            let temp = event.target;
            //console.log("0426",event);
            for (let i = 0; i < 4 && temp; i++) {
                if (temp?.getAttribute("data-type") == "navigation-file"
                    || temp?.getAttribute("data-type") == "navigation-root") {
                    target = temp;
                    break;
                }
                temp = temp?.parentNode;
            }
            //console.log("0426target", target);
            if (target?.getAttribute("data-type") == "navigation-file"
              || target?.getAttribute("data-type") == "navigation-root") {
                const b3ListItemToggle = target.querySelector('.b3-list-item__toggle');
                const title = target.querySelector('.b3-list-item__text');
                if (b3ListItemToggle.classList.contains('fn__hidden')) return;
                event.preventDefault();
                b3ListItemToggle.click();
                if (event.ctrlKey) {
                    title.click();
                }
            }
        }, true);
    }
})();

  • 思源笔记

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

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

    23447 引用 • 94900 回帖 • 1 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8684 引用 • 39601 回帖 • 144 关注
2 操作
wenbocn 在 2025-01-09 15:21:16 更新了该帖
wenbocn 在 2025-01-09 15:04:16 更新了该帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 我等下写到插件里面吧

    1 回复
  • 等等,不对,查有没有子文档我不太会查,还是不写了

  • zxkmm 2 评论

    可以尝试一下找个 ai,把我的插件源码全都复制过去然后让它加功能就行,插件的功能性代码全都在 index.ts,我感觉 ai 会写 sql,我不会写所以没办法查子文档

    我感觉最理想的设计应该是:点之后如果这个文档是空的,就作展开操作,否则如果文档不是空的,就作打开文档操作。但还是因为我不会写 sql 所以没办法写这个功能

    1 回复
    大佬,判断是否有子文档不用写 SQL 也可以,1,data-count 属性判断(貌似最新版才行,3.1.14 后是可以,旧版不支持实时更新,需要刷新才行),2,.b3-list-item__arrow 是否有小箭头判断
    wilsons
    @wilsons 👍🏻👍🏻
    wenbocn
  • wenbocn

    大佬,中键展开文档树的代码就能区分是否有子文档,您能否再看看或试一下这个 js🙏🏻

    1 回复
  • wenbocn

    用文档图标是否是文件夹判断也行的

  • zxkmm 3 评论

    感谢您的提醒。

    这个实现挺聪明的,看 toggle 有没有加了隐藏的 css class,可能比查表还快

    if (b3ListItemToggle.classList.contains('fn__hidden')) return;
    
    但有一个关键问题是,这个判断其实是没有用的。因为你可以直接假设它有子文档。这种情况下它真有,那很好,展开。如果它没有,那也很好,它打开。所以这个判断是没有作用的
    zxkmm
    我刚刚翻到一个可能可以照抄的 sql: 查询当前笔记本下的所有文档,并列出该文档已被加入的数据库,如果没有加入,则为空 这个判断会有用我感觉
    zxkmm
    @zxkmm 😂 大佬我不懂,您看着弄 👍🏻👍🏻
    wenbocn 1
  • zxkmm 11 评论

    另外如果实现了不需要给我积分。因为积分对我没有用。可以给 @wilsons, ta 是订阅用户。积分对他有用

    1 回复
    大佬不用,一码归一码,你的功劳当然得给你。 @wenbocn 可以帮他 github star 他需要 star
    wilsons
    @wilsons 收到,感谢两位大佬的帮忙!👍🏻👍🏻
    wenbocn
    @wilsons 因为如果实现的话我会用您的 sql
    zxkmm
    @zxkmm 功劳有限,如果用 SQL 判断是否有子文档,用 select count(*) as count from blocks where path like '% 文档 id%' and type = 'd';这个应该就行了吧,cout > 1 有子文档
    wilsons
    @wilsons 刚才发现思源内核有 getChildBlocks 这个对我来说简单点
    zxkmm
    @zxkmm 不可以,这个判断的是块,比如标题是否有子块等,不能判断文档是否有子文档,如果传入文档 id 获取的是文档下的所有块。 await requestApi('/api/block/getDocInfo', {id: '20241113081003-xl24lyy'}) 这个 api 可以,返回结果有个 subFileCount 字段可以判断。
    wilsons
    @wilsons 我现阶段是发现 getChildBlocks 的每个 item, 然后遍历所有的 item,如果 item 没有 markdown 字段,说明是空的,如果有 markdown 字段,说明不是空的,从而说明文档不是空的。因为空文档总是有一个空块,不知道 sql 怎么处理 (然后不需要遍历所有 item,我写了一个阈值,如果是连续三个都是空的就是算是空的,因为虽然明面上思源不可能打出连续两个空块,但是有的用户可能有这种样子的东西,因为各种因素))
    zxkmm
    @wilsons 具体方案我刚才 push 了代码,可以康康 :)
    zxkmm
    @zxkmm 我觉得不太对,我前面 3 行都空,第 4 行有东西也可以呀,需要全部遍历,要么用箭头函数,比如,空文档:childBlocks.find(b => b.markdown)===undefined,!==undefined 是非空文档
    wilsons
    @wilsons 有的人用单个文档来存小说,遇到这种情况如果全都遍历会卡死的。所以我只能放弃前三个块都是空的情况。而且思源的编辑器本身也就不支持同时两个空块。只是可能会有一部分插件造成这种现象,所以这个本身就是 edge case
    zxkmm
    @zxkmm 没太懂你说的空块是指什么?一直回车不输入东西,不是可以连续多个空块吗?如果内容过多,可以用 SQL,SQL 有索引,没有性能瓶颈,select count(*) as count from blocks where root_id = '文档 id' and type != 'd' and markdown != ''; count>0 不为空
    wilsons
  • wenbocn

    收到,感谢两位大佬的帮忙!👍🏻👍🏻

  • 我这边鼠标中键无法覆盖思源本身的“新窗口打开”行为。

请输入回帖内容 ...

推荐标签 标签

  • uTools

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

    6 引用 • 14 回帖
  • 印象笔记
    3 引用 • 16 回帖
  • Ubuntu

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

    126 引用 • 169 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 28 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    143 引用 • 442 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Hexo

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

    21 引用 • 140 回帖 • 9 关注
  • Mac

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

    166 引用 • 595 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8684 引用 • 39600 回帖 • 144 关注
  • gRpc
    11 引用 • 9 回帖 • 76 关注
  • 996
    13 引用 • 200 回帖 • 13 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 41 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    289 引用 • 4492 回帖 • 663 关注
  • 电影

    这是一个不能说的秘密。

    121 引用 • 605 回帖
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    692 引用 • 535 回帖
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 4 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    313 引用 • 547 回帖
  • 开源中国

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

    7 引用 • 86 回帖
  • BND

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

    107 引用 • 1281 回帖 • 38 关注
  • Anytype
    3 引用 • 31 回帖 • 1 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 3 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 3 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖