[js] 替换原始 跳转到开头和末尾 快捷键效果

本贴最后更新于 183 天前,其中的信息可能已经渤澥桑田

操作&效果

原有效果: 不管光标在哪里, 使用 ctrl+homnectrl+end 都是跳转到整个文档的开头和结尾

修改后效果:

  1. 当光标在代码块中间的时候, 使用 ctrl+homnectrl+end 跳转到代码块的开头和结尾
  2. 当光标在代码块开头和结尾的时候, 跳转到整个文档的开头和结尾
  3. 当光标在非代码块的时候, 跳转到整个文档的开头和结尾

js 代码

(()=>{ // 获取光标所在的元素 function getElementAtCursor() { const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); const startContainer = range.startContainer; // 如果是文本节点,获取其父元素 const element = startContainer.nodeType === 3 ? startContainer.parentNode : startContainer; return element; } return null; // 如果没有选中内容或光标位置无效 } // 当前块是否是代码块 function getCodeBlockDfs(ele) { if (ele.classList.contains('protyle-wysiwyg')) { return null } if (ele.classList.contains('hljs')) { return ele } return getCodeBlockDfs(ele.parentElement) } async function handle_goto_home(event, element) { if (!element) { return; } element = getCodeBlockDfs(element) if (element == null) { console.log("[跳转开头] 所在位置不是代码块, 使用默认功能") return; } // 找到代码块的第一个子元素, 用于判断 let firstChild = element.querySelector('[contenteditable="true"]')?.firstChild if (firstChild == null) { console.log("[跳转开头] 子元素寻找失败, 使用默认功能") return; } // 获取当前的 Selection 对象 const selection = window.getSelection(); // 获取选择的范围 const range = selection.getRangeAt(0); // 判断光标是否在第一个子元素的开头 if (range.startContainer !== firstChild || range.startOffset !== 0) { if (range.startContainer !== firstChild) { console.log("[跳转开头] 不在第一个子元素附近, 功能生效") } else if (range.startOffset !== 0) { console.log("[跳转开头] 不在第一个子元素的开头, 功能生效") } event.preventDefault(); // 防止快捷键默认行为 event.stopPropagation(); // 停止事件传播 // 如果不在,移动到最前面 range.selectNodeContents(firstChild); range.collapse(true); selection.removeAllRanges(); selection.addRange(range); } else { console.log("[跳转开头] 已经在最开头了, 使用默认功能") } } async function handle_goto_end(event, element) { if (!element) { return; } element = getCodeBlockDfs(element) if (element == null) { console.log("[跳转末尾] 所在位置不是代码块, 使用默认功能") return; } // 找到代码块的第一个子元素, 用于判断 let lastChild = element.querySelector('[contenteditable="true"]')?.lastChild if (lastChild == null) { console.log("[跳转末尾] 子元素寻找失败, 使用默认功能") return; } // 获取当前的 Selection 对象 const selection = window.getSelection(); // 获取选择的范围 const range = selection.getRangeAt(0); // 判断光标是否在第一个子元素的开头 if (range.startContainer !== lastChild || range.startOffset !== lastChild.textContent.length) { if (range.startContainer !== lastChild) { console.log("[跳转末尾] 不在最后一个子元素附近, 功能生效") } else if (range.startOffset !== lastChild.textContent.length) { console.log("[跳转末尾] 不在最后一个子元素的末尾, 功能生效") } event.preventDefault(); // 防止快捷键默认行为 event.stopPropagation(); // 停止事件传播 // 如果不在,移动到最前面 range.selectNodeContents(lastChild); range.collapse(false); selection.removeAllRanges(); selection.addRange(range); } else { console.log("[跳转末尾] 已经在代码块最末尾了, 使用默认功能") } } // 事件监听 document.addEventListener('keydown', async (event) => { let element = getElementAtCursor(); // event.preventDefault(); // 防止快捷键默认行为 // event.stopPropagation(); // 停止事件传播 if (event.ctrlKey && !event.shiftKey && !event.altKey && event.key.toLowerCase() === 'home') { // 判断是否需要处理 跳转到代码块开头, 并处理 handle_goto_home(event, element); } else if (event.ctrlKey && !event.shiftKey && !event.altKey && event.key.toLowerCase() === 'end') { // 判断是否需要处理 跳转到代码块末尾, 并处理 handle_goto_end(event, element); } }); })()
  • 思源笔记

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

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

    25341 引用 • 104641 回帖 • 1 关注
  • 代码片段

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

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

    159 引用 • 1023 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 你的代码风格变了,拥抱驼峰风格了。

    1 回复
  • EmberSky

    有没有一种可能, 这是 ai 写的

    我还是喜欢下划线, 看着直观, 但是 ai 生成的 js 代码, 都是驼峰, 我懒得改了

    所以现在是两种混在一起

    1 回复
  • 😄 下划线我看着眼花,貌似驼峰更流行。

    1 回复
  • EmberSky

    巧了, 驼峰看的我眼花

    1 回复
  • wilsons 1 赞同

    trollface 嗯,都是不习惯的缘故,看习惯就好了,我以前也经常用蛇形风格,自从用了驼峰,蛇形不习惯了。

推荐标签 标签

  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 22 关注
  • AWS
    11 引用 • 28 回帖 • 12 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 376 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 549 关注
  • OneNote
    1 引用 • 3 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • JVM

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

    180 引用 • 120 回帖 • 1 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 3 关注
  • RYMCU

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

    4 引用 • 6 回帖 • 57 关注
  • Access
    1 引用 • 3 回帖 • 1 关注
  • IBM

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

    17 引用 • 53 回帖 • 144 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 76 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 128 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 1 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • Openfire

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

    6 引用 • 7 回帖 • 105 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • Quicker

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

    37 引用 • 157 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 366 关注
  • CAP

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

    12 引用 • 5 回帖 • 631 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 92 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 2 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 647 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖 • 2 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    173 引用 • 518 回帖
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 830 关注