[js] 快速改样式 ----// 利用 protyle.toolbar.setInlineMark 进行块更新后保存

//protyle.toolbar.setInlineMark (() => { // 创建按钮组 const buttonGroup = document.createElement('div'); buttonGroup.style.position = 'fixed'; buttonGroup.style.top = '600px'; buttonGroup.style.left = '1200px'; buttonGroup.style.display = 'flex'; buttonGroup.style.flexDirection = 'column'; buttonGroup.style.cursor = 'move'; buttonGroup.style.userSelect = 'none'; // 创建颜色按钮 function createButton(color) { const button = document.createElement('button'); button.textContent = color.name; button.style.backgroundColor = color.background; button.style.color = color.color; button.style.padding = '1px 2px'; button.style.border = 'none'; button.style.cursor = 'pointer'; button.style.marginBottom = '5px'; button.addEventListener('click', async () => { const protyle = getProtyle(); if (!protyle) { console.error("未找到 Protyle 实例"); return; } const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); if (range.startContainer.nodeType === Node.TEXT_NODE && range.startContainer.parentNode) { protyle.toolbar.setInlineMark(protyle, "bold", range); if (color.background) { protyle.toolbar.setInlineMark(protyle, "backgroundColor", range, { type: "backgroundColor", color: color.background }); } if (color.color) { protyle.toolbar.setInlineMark(protyle, "color", range, { type: "color", color: color.color }); } } else { console.error("选中的文本范围不包含有效的节点"); } } }); button.addEventListener('mouseover', () => { button.style.background = 'linear-gradient(to right, #ff7e5f, #feb47b)'; button.style.color = 'white'; }); button.addEventListener('mouseout', () => { button.style.background = color.background; button.style.color = color.color; }); return button; } // 创建清除样式按钮 function createClearButton() { const button = document.createElement('button'); button.textContent = '清除'; button.style.backgroundColor = '#CCCCCC'; button.style.color = '#000000'; button.style.padding = '1px 2px'; button.style.border = 'none'; button.style.cursor = 'pointer'; button.addEventListener('click', async () => { const protyle = getProtyle(); if (!protyle) { console.error("未找到 Protyle 实例"); return; } const selection = window.getSelection(); if (selection.rangeCount > 0) { const range = selection.getRangeAt(0); if (range.startContainer.nodeType === Node.TEXT_NODE && range.startContainer.parentNode) { protyle.toolbar.setInlineMark(protyle, "clear", range); } else { console.error("选中的文本范围不包含有效的节点"); } } }); return button; } // 获取Protyle实例 function getProtyle() { try { if (document.getElementById("sidebar")) return siyuan.mobile.editor.protyle; const currDoc = siyuan?.layout?.centerLayout?.children.map(item => item.children.find(item => item.headElement?.classList.contains('item--focus') && (item.panelElement.closest('.layout__wnd--active') || item.panelElement.closest('[data-type="wnd"]')))).find(item => item); return currDoc?.model.editor.protyle; } catch (e) { console.error(e); return null; } } const colors = [ { name: '黄色', background: '#FFFF00', color: '#000000' }, { name: '蓝色', background: '#0000FF', color: '#FFFFFF' }, { name: '绿色', background: '#00FF00', color: '#000000' }, { name: '红色', background: '#FF0000', color: '#FFFFFF' } ]; const buttons = colors.map(createButton); const clearButton = createClearButton(); document.addEventListener('keydown', function (e) { if (e.ctrlKey) { const key = e.key.toLowerCase(); const index = ['e', 'r', 't', 'y'].indexOf(key); if (index !== -1) { buttons[index].click(); } if (key === 'c') { clearButton.click(); } } }); buttons.forEach(button => buttonGroup.appendChild(button)); buttonGroup.appendChild(clearButton); document.body.appendChild(buttonGroup); let startX; let startY; let isDragging = false; buttonGroup.addEventListener('mousedown', function (e) { isDragging = true; startX = e.clientX; startY = e.clientY; }); document.addEventListener('mousemove', function (e) { if (isDragging) { const dx = e.clientX - startX; const dy = e.clientY - startY; const rect = buttonGroup.getBoundingClientRect(); let newLeft = rect.left + dx; let newTop = rect.top + dy; const viewportWidth = window.innerWidth; const viewportHeight = window.innerHeight; const buttonGroupWidth = buttonGroup.offsetWidth; const buttonGroupHeight = buttonGroup.offsetHeight; newLeft = Math.max(0, Math.min(newLeft, viewportWidth - buttonGroupWidth)); newTop = Math.max(0, Math.min(newTop, viewportHeight - buttonGroupHeight)); buttonGroup.style.left = `${newLeft}px`; buttonGroup.style.top = `${newTop}px`; startX = e.clientX; startY = e.clientY; } }); document.addEventListener('mouseup', function () { isDragging = false; }); })();
  • 思源笔记

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

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

    26272 引用 • 109213 回帖
  • 代码片段

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

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

    199 引用 • 1420 回帖 • 1 关注
1 操作
cxg318 在 2025-01-18 01:14:32 更新了该帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • cxg318
    作者

    PixPin20250118003959.gif

  • Wetoria 2 评论

    trollface 阁下可曾试过选中已经设置过样式的地方

    换个方式,不用 updateBlock ,样式设置过的地方没什么问题。就是浮窗中不起作用,不知道怎么弄。
    cxg318
    @cxg318 突然想到,要不要给叶归加上选择自定义颜色了
    Wetoria 1 赞同

推荐标签 标签

  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 661 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    77 引用 • 37 回帖 • 1 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 爬虫

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

    106 引用 • 275 回帖
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • RemNote
    2 引用 • 16 回帖 • 26 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 625 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 7 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • C

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

    86 引用 • 165 回帖
  • golang

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

    500 引用 • 1396 回帖 • 250 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 111 关注
  • Access
    1 引用 • 3 回帖 • 4 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 35 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 2 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 559 关注
  • IPFS

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

    20 引用 • 245 回帖 • 232 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 1 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • Hprose

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

    9 引用 • 17 回帖 • 642 关注
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • TensorFlow

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

    20 引用 • 19 回帖 • 3 关注
  • CAP

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

    12 引用 • 5 回帖 • 630 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 614 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 344 关注