思源的复制图片上是复制相对路径的,老是要右键进行复制,所以希望可以在图片上方悬浮一个复制为 png 的按钮,鼠标移动到那里才显示
希望社区大佬可以帮忙下写一段 js 代码
思源的复制图片上是复制相对路径的,老是要右键进行复制,所以希望可以在图片上方悬浮一个复制为 png 的按钮,鼠标移动到那里才显示
希望社区大佬可以帮忙下写一段 js 代码
思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。
融合块、大纲和双向链接,重构你的思维。
代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。
用户在该标签下分享代码片段时需在帖子标题前添加 [css]
或 [js]
用于区分代码片段类型。
提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。
// 图片复制到png按钮放到外层右上角 (()=>{ let isOn = false; document.addEventListener('mouseover', (e)=>{ const img = e.target.closest('[data-type="img"]'); if(!img) return; if(isOn) return; isOn = true; setTimeout(()=>isOn=false, 100); if(img.querySelector('.cst-copy-png')) return; const action = img.querySelector('.protyle-action'); if(!action) return; const actionIcon = img.querySelector('.protyle-action .protyle-icon'); if(actionIcon) { actionIcon.style.borderTopLeftRadius = '0'; actionIcon.style.borderBottomLeftRadius = '0'; } const copyPngHtml = `<span class="protyle-icon protyle-icon--only protyle-custom cst-copy-png" style="border-top-right-radius:0;border-bottom-right-radius:0"><svg class="svg"><use xlink:href="#iconImage"></use></svg></span>`; action.insertAdjacentHTML('afterbegin', copyPngHtml); const copyPngBtn = img.querySelector('.cst-copy-png'); copyPngBtn.addEventListener('click', (e) => { e.stopPropagation(); copyPNGByLink(img.querySelector('img')?.getAttribute("src")||''); }); }); // see https://github.com/siyuan-note/siyuan/blob/e47b8efc2f2611163beca9fad4ee5424001515ff/app/src/menus/util.ts#L175 function copyPNGByLink(link) { if(!link) return; if (isInAndroid()) { window.JSAndroid.writeImageClipboard(link); return; } else { const canvas = document.createElement("canvas"); const tempElement = document.createElement("img"); tempElement.onload = (e) => { canvas.width = e.target.width; canvas.height = e.target.height; canvas.getContext("2d").drawImage(e.target, 0, 0, e.target.width, e.target.height); canvas.toBlob((blob) => { navigator.clipboard.write([ new ClipboardItem({ // @ts-ignore ["image/png"]: blob }) ]); }, "image/png", 1); }; tempElement.src = link; } } function isInAndroid() { return window.siyuan.config.system.container === "android" && window.JSAndroid; } })();
这个不建议放左侧,因为如果是在线图片,本来就有个图标,在加上我之前的图片链接 [js] 给图片添加超链接 也有个图标
这里在再加,有点多了,建议放右上角
@lichlaughing 如果本地图片可与实现复制不同格式,如果在线图片可能存在跨域问题,复制不了。官方用 canvas 实现的,但 canvas 支持支持的图片格式有限。
// 图片复制到png按钮放到外层右上角 (()=>{ let isOn = false; document.addEventListener('mouseover', (e)=>{ const img = e.target.closest('[data-type="img"]'); if(!img) return; if(isOn) return; isOn = true; setTimeout(()=>isOn=false, 100); if(img.querySelector('.cst-copy-png')) return; const action = img.querySelector('.protyle-action'); if(!action) return; const actionIcon = img.querySelector('.protyle-action .protyle-icon'); if(actionIcon) { actionIcon.style.borderTopLeftRadius = '0'; actionIcon.style.borderBottomLeftRadius = '0'; } const copyPngHtml = `<span class="protyle-icon protyle-icon--only protyle-custom cst-copy-png" style="border-top-right-radius:0;border-bottom-right-radius:0"><svg class="svg"><use xlink:href="#iconImage"></use></svg></span>`; action.insertAdjacentHTML('afterbegin', copyPngHtml); const copyPngBtn = img.querySelector('.cst-copy-png'); copyPngBtn.addEventListener('click', (e) => { e.stopPropagation(); copyPNGByLink(img.querySelector('img')?.getAttribute("src")||''); }); }); // see https://github.com/siyuan-note/siyuan/blob/e47b8efc2f2611163beca9fad4ee5424001515ff/app/src/menus/util.ts#L175 function copyPNGByLink(link) { if(!link) return; if (isInAndroid()) { window.JSAndroid.writeImageClipboard(link); return; } else { const canvas = document.createElement("canvas"); const tempElement = document.createElement("img"); tempElement.onload = (e) => { canvas.width = e.target.width; canvas.height = e.target.height; canvas.getContext("2d").drawImage(e.target, 0, 0, e.target.width, e.target.height); canvas.toBlob((blob) => { navigator.clipboard.write([ new ClipboardItem({ // @ts-ignore ["image/png"]: blob }) ]); }, "image/png", 1); }; tempElement.src = link; } } function isInAndroid() { return window.siyuan.config.system.container === "android" && window.JSAndroid; } })();
一些有用的避坑指南。
域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。
一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
这是一个不能说的秘密。
FreeMarker 是一款好用且功能强大的 Java 模版引擎。
单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
哪里都缺人,哪里都不缺人。
应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。
Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。
VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。
Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。
Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。
心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。
NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。
Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。
Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。
阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。
RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
为成为自由职业者在家办公而努力吧!
Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。
JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。