求代码片段 | 默认全屏编辑

  • 思源笔记

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

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

    22938 引用 • 92230 回帖 • 1 关注
  • Q&A

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

    8413 引用 • 38328 回帖 • 156 关注
1 操作
JOYCELEEEEE 在 2024-08-26 16:19:29 更新了该帖
被采纳的回答
  • 默认全屏可以实现,但思源的全屏(alt+y)是基于文档的,即如果你没打开任何文档是无法全屏的。

    这一点你测试下就知道了,比如把所有文档关闭,然后按 alt+y 是不会全屏的。

    所以,要想软件打开时全屏,你关闭软件的时候文档不能全关闭,至少留一个文档不关。

    否则,打开软件时全屏失效。

    如果这样的逻辑可以满足你的需求,那么下面的代码即可实现,打开软件时自动全屏。

    放到 js 代码片段即可。

    (async ()=>{
        await whenElementExist(async ()=>{
            const currentTab = document.querySelector('.layout__center li[data-type="tab-header"].item--focus');
            if(!currentTab) return false;
            const dataId = currentTab.dataset.id;
            if(!dataId) return false;
            const currentContent = document.querySelector('.layout__center .fn__flex-1.protyle[data-id="'+dataId+'"]');
            if(!currentContent) return false;
            await sleep(100);
            currentContent.classList.add("fullscreen");
            window.siyuan.editorIsFullscreen = true;
            return true;
        });
        // 延迟执行
        function sleep(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        }
        // 等待元素渲染完成后执行
        function whenElementExist(selector) {
            return new Promise(resolve => {
                const checkForElement = () => {
                    let element = null;
                    if (typeof selector === 'function') {
                        element = selector();
                    } else {
                        element = document.querySelector(selector);
                    }
                    if (element) {
                        resolve(element);
                    } else {
                        requestAnimationFrame(checkForElement);
                    }
                };
                checkForElement();
            });
        }
    })();
    

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 本来切文档就不退出全屏,你是否安装了什么插件导致有冲突?

    建议在新空间测试看看。

    然后关闭插件主题等排查什么原因导致的。

    1 回复
  • JOYCELEEEEE

    的确是,这个问题排除了。

    打开思源默认全屏大佬可以实现吗?

    2 回复
  • EmberSky

    实现是可以实现的: 加载页面的时候, 判断没有某个元素(比如文档树/大纲), 触发快捷键 alt+y

    不过我比较好奇: 你会经常关闭软件么, 软件一直挂着不行么

    我个人一般都不关软件的, 除非是电脑要关机

    2 回复
  • JOYCELEEEEE

    一直挂着偶尔会弹出崩溃提示,怕出岔子。

    个人习惯是软件用完就关,精神洁癖可能 😂

  • 默认全屏可以实现,但思源的全屏(alt+y)是基于文档的,即如果你没打开任何文档是无法全屏的。

    这一点你测试下就知道了,比如把所有文档关闭,然后按 alt+y 是不会全屏的。

    所以,要想软件打开时全屏,你关闭软件的时候文档不能全关闭,至少留一个文档不关。

    否则,打开软件时全屏失效。

    如果这样的逻辑可以满足你的需求,那么下面的代码即可实现,打开软件时自动全屏。

    放到 js 代码片段即可。

    (async ()=>{
        await whenElementExist(async ()=>{
            const currentTab = document.querySelector('.layout__center li[data-type="tab-header"].item--focus');
            if(!currentTab) return false;
            const dataId = currentTab.dataset.id;
            if(!dataId) return false;
            const currentContent = document.querySelector('.layout__center .fn__flex-1.protyle[data-id="'+dataId+'"]');
            if(!currentContent) return false;
            await sleep(100);
            currentContent.classList.add("fullscreen");
            window.siyuan.editorIsFullscreen = true;
            return true;
        });
        // 延迟执行
        function sleep(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        }
        // 等待元素渲染完成后执行
        function whenElementExist(selector) {
            return new Promise(resolve => {
                const checkForElement = () => {
                    let element = null;
                    if (typeof selector === 'function') {
                        element = selector();
                    } else {
                        element = document.querySelector(selector);
                    }
                    if (element) {
                        resolve(element);
                    } else {
                        requestAnimationFrame(checkForElement);
                    }
                };
                checkForElement();
            });
        }
    })();
    
    1 回复
    1 操作
    wilsons 在 2024-08-26 18:50:19 更新了该回帖
  • 大佬,触发快捷键怎么触发?这个好像是发送按键,思源里应该不好实现吧,不知道你有什么好办法吗?

    2 回复
  • JOYCELEEEEE

    大佬,好像又不行 🤦‍

    刚开启代码片段可以全屏,关闭再打开就不行了。

    全新空间测试,没有其他代码片段,以下录屏:

    1 回复
  • EmberSky

    没啥好的, 我从其他地方抄的

    
        // 通过快捷键(alt + p), 打开配置页面
        function openSettingPage() {
            let keyInit = {
                ctrlKey: false,
                altKey: true,
                metaKey: false,
                shiftKey: false,
                key: 'P',
                keyCode: 80
            }
            keyInit["bubbles"] = true;
            let keydownEvent = new KeyboardEvent('keydown', keyInit);
            document.getElementsByTagName("body")[0].dispatchEvent(keydownEvent);
            let keyUpEvent = new KeyboardEvent('keyup', keyInit);
            document.getElementsByTagName("body")[0].dispatchEvent(keyUpEvent);
        }
    
  • EmberSky 1
    
    /** 获取配置里面的快捷键, 并触发
     * 
     */
    function dispatchKeyEvent(functionName) {
      let keyInit = parseHotKeyStr(window.top.siyuan.config.keymap.general[functionName].custom);
      keyInit["bubbles"] = true;
      let keydownEvent = new KeyboardEvent('keydown', keyInit);
      document.getElementsByTagName("body")[0].dispatchEvent(keydownEvent);
      let keyUpEvent = new KeyboardEvent('keyup', keyInit);
      document.getElementsByTagName("body")[0].dispatchEvent(keyUpEvent);
    }
    
    /**
     * 
     * @param {*} hotkeyStr 思源hotkey格式 Refer: https://github.com/siyuan-note/siyuan/blob/d0f011b1a5b12e5546421f8bd442606bf0b5ad86/app/src/protyle/util/hotKey.ts#L4
     * @returns KeyboardEventInit Refer: https://developer.mozilla.org/zh-CN/docs/Web/API/KeyboardEvent/KeyboardEvent
     */
    function parseHotKeyStr(hotkeyStr) {
      let result = {
        ctrlKey: false,
        altKey: false,
        metaKey: false,
        shiftKey: false,
        key: 'A',
        keyCode: 0
      }
      if (hotkeyStr == "" || hotkeyStr == undefined || hotkeyStr == null) {
        console.error("解析快捷键设置失败", hotkeyStr);
        throw new Error("解析快捷键设置失败");
      }
      let onlyKey = hotkeyStr;
      if (hotkeyStr.indexOf("⌘") != -1) {
        result.ctrlKey = true;
        onlyKey = onlyKey.replace("⌘", "");
      }
      if (hotkeyStr.indexOf("⌥") != -1) {
        result.altKey = true;
        onlyKey = onlyKey.replace("⌥", "");
      }
      if (hotkeyStr.indexOf("⇧") != -1) {
        result.shiftKey = true;
        onlyKey = onlyKey.replace("⇧", "");
      }
      // 未处理 windows btn (MetaKey) 
      result.key = onlyKey;
      // 在https://github.com/siyuan-note/siyuan/commit/70acd57c4b4701b973a8ca93fadf6c003b24c789#diff-558f9f531a326d2fd53151e3fc250ac4bd545452ba782b0c7c18765a37a4e2cc
      // 更改中,思源改为使用keyCode判断快捷键按下事件,这里进行了对应的转换
      // 另请参考该提交中涉及的文件
      result.keyCode = keyCodeList[result.key];
      console.assert(result.keyCode != undefined, `keyCode转换错误,key为${result.key}`);
      switch (result.key) {
        case "→": {
          result.key = "ArrowRight";
          break;
        }
        case "←": {
          result.key = "ArrowLeft";
          break;
        }
        case "↑": {
          result.key = "ArrowUp";
          break;
        }
        case "↓": {
          result.key = "ArrowDown";
          break;
        }
        case "⌦": {
          result.key = "Delete";
          break;
        }
        case "⌫": {
          result.key = "Backspace";
          break;
        }
        case "↩": {
          result.key = "Enter";
          break;
        }
      }
      return result;
    }
    
    if (g_addSnippets) addSnippets();
    
    const keyCodeList = {
      "⌫": 8,
      "⇥": 9,
      "↩": 13,
      "⇧": 16,
      "⌘": 91,
      "⌥": 18,
      "Pause": 19,
      "CapsLock": 20,
      "Escape": 27,
      " ": 32,
      "PageUp": 33,
      "PageDown": 34,
      "End": 35,
      "Home": 36,
      "←": 37,
      "↑": 38,
      "→": 39,
      "↓": 40,
      "PrintScreen": 44,
      "Insert": 45,
      "⌦": 46,
      "0": 48,
      "1": 49,
      "2": 50,
      "3": 51,
      "4": 52,
      "5": 53,
      "6": 54,
      "7": 55,
      "8": 56,
      "9": 57,
      "A": 65,
      "B": 66,
      "C": 67,
      "D": 68,
      "E": 69,
      "F": 70,
      "G": 71,
      "H": 72,
      "I": 73,
      "J": 74,
      "K": 75,
      "L": 76,
      "M": 77,
      "N": 78,
      "O": 79,
      "P": 80,
      "Q": 81,
      "R": 82,
      "S": 83,
      "T": 84,
      "U": 85,
      "V": 86,
      "W": 87,
      "X": 88,
      "Y": 89,
      "Z": 90,
      "ContextMenu": 93,
      "MyComputer": 182,
      "MyCalculator": 183,
      ";": 186,
      "=": 187,
      ",": 188,
      "-": 189,
      ".": 190,
      "/": 191,
      "`": 192,
      "[": 219,
      "\\": 220,
      "]": 221,
      "'": 222,
      "*": 106,
      "+": 107,
      "-": 109,
      ".": 110,
      "/": 111,
      "F1": 112,
      "F2": 113,
      "F3": 114,
      "F4": 115,
      "F5": 116,
      "F6": 117,
      "F7": 118,
      "F8": 119,
      "F9": 120,
      "F10": 121,
      "F11": 122,
      "F12": 123,
      "NumLock": 144,
      "ScrollLock": 145
    };
    
    1 回复
  • 没啥大毛病了,重新打开渲染慢了点,执行全屏时,文档还没渲染完成。

    代码已修改,加了 await sleep(100);

    根据自己需要,一般延迟 100 毫秒足够了,如果你电脑上有问题的话就再延迟多一些就行了。

  • 大佬牛掰啊 👍 ,学习了。

    1 回复
  • EmberSky 1 评论

    全是抄的, 一点的技巧都木得

    不不不,剑客有把好剑还是剑客呀
    wilsons
  • 现在有个方便切换全屏的方法: [js] 在面包屑旁添加全屏按钮,快捷切换全屏

    1 回复
  • JOYCELEEEEE

    大佬万岁!

请输入回帖内容 ...

推荐标签 标签

  • TGIF

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

    288 引用 • 4485 回帖 • 663 关注
  • 思源笔记

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

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

    22938 引用 • 92226 回帖 • 1 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 141 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 535 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 718 关注
  • 爬虫

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

    106 引用 • 275 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 2 关注
  • V2Ray
    1 引用 • 15 回帖
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 223 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1114 回帖 • 126 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 3 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 479 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    51 引用 • 25 回帖 • 2 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1795 回帖
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 624 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 17 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 61 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 364 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 99 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 53 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 464 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 476 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 529 关注