前端图形学【免费下载链接】svgeditPowerful SVG-Editor for your browser项目地址https://gitcode.com/gh_mirrors/sv/svgedit点击查看免费下载导读本文基于 SVG-Edit 官方教程 docs/tutorials/Events.md系统梳理 SVG-Edit 的完整事件体系从嵌入场景下的setCustomHandlers保存/打开/导出拦截到父窗口的svgEditorReady就绪信号再到帧内svgEditor.ready回调与底层 Canvas 事件的bind/call机制。读完本文你将能够自主实现「自定义保存/导出流程」「iframe 嵌入初始化」「扩展挂钩事件」「Canvas 级事件监听」四类典型需求并理解这些事件在源码中的真实调用链路。一、UI 事件自定义处理器setCustomHandlers在默认情况下SVG-Edit 的保存、打开与导出行为由编辑器内置逻辑驱动。当你需要把「保存」重定向到自己的后端、云存储或本地文件系统时可以通过svgEditor.setCustomHandlers()注入自定义处理器例如在扩展中拦截保存事件svgEditor.setCustomHandlers({ save (_win, _data) { // Save svg // 此处可调用 fetch 将 _data 中的 SVG 字符串发送到你的服务端 } })除save外与 UI 事件对应、同样可以被替换的方法还有open与exportImage。三者对应的回调签名与职责在 src/editor/Editor.js 的CustomHandler接口注释中有明确规定open()不接收参数。职责是「调用文件选择对话框让用户挑选一个 SVG 文件并通过svgCanvas.setSvgString()载入该文件内容」。save(win, svgStr)win为当前窗口对象svgStr是当前文档的 SVG 字符串对应savedCanvas 事件携带的数据。职责是「接受当前文档字符串、弹出保存对话框并写入用户选择的位置」。exportImage(win, data)data对应exportedCanvas 事件包含issues问题列表与svg字符串等属性。职责是「将 SVG 字符串按typePNG、JPEG、BMP、WEBP、PDF、mimeType、qualityJPEG/WEBP等属性转换为目标图片格式」。exportPDF(win, data)对应exportedPDF事件处理 PDF 导出。所有方法均为可选你只需要覆盖自己关心的部分。在仓库现有的扩展中src/editor/extensions/ext-opensave/ext-opensave.js 正是通过setCustomHandlers()将保存行为改写到服务端的典型范例配合fileopen.php/savefile.php等后端脚本使用。此外setCustomHandlers传递的对象还要求符合CustomHandler的格式约束具体可参考 ConfigOptions 教程 中关于extensions、userExtensions配置的说明。二、父窗口 / 打开窗口事件svgEditorReady当 SVG-Edit 以 iframe 或弹出窗口方式嵌入其他页面时宿主页面需要知道编辑器何时初始化完毕以便开始注入内容。编辑器在启动完成配置加载、Canvas 创建、面板初始化之后会向宿主文档派发svgEditorReady事件$(document).bind(svgEditorReady, function () { const svg !DOCTYPE svg PUBLIC -//W3C//DTD SVG 1.1//EN http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd svg xmlnshttp://www.w3.org/2000/svg width100 height50 ellipse cx50 cy25 rx50 ry25 stylefill:blue;/ /svg $(iframe.svgedit)[0].contentWindow.svgCanvas.setSvgString(svg) })其源码实现在 src/editor/EditorStartup.js 的readySignal()函数中编辑器取window.opener || window.parent作为宿主窗口构造一个CustomEvent(svgEditorReady, { bubbles: true, cancelable: true })并通过w.document.documentElement.dispatchEvent(...)派发到宿主文档的根元素上。该调用发生在init()流程中「各面板初始化完毕、外部打开者就绪」的位置见 src/editor/EditorStartup.js。需要特别注意事件派发目标被包裹在try/catch中即使宿主窗口跨域导致访问失败也不会中断编辑器启动示例中使用 jQuery 的$(document).bind(...)监听普通 DOM 事件若宿主页面没有引入 jQuery等价的原生写法是document.addEventListener(svgEditorReady, handler)由于事件不带任何负载数据宿主需要通过iframe.contentWindow.svgCanvas直接访问帧内 Canvas 实例来操作文档如上例的setSvgString。三、编辑器帧内事件svgEditor.canvas与svgEditor.ready如果你本身就在 SVG-Edit 的帧内工作例如编写扩展、或与编辑器运行在同文档环境则应使用svgEditor对象暴露的接口svgEditor.canvas即编辑器持有的SvgCanvas实例创建于 src/editor/EditorStartup.js类型为module:svgcanvas.SvgCanvas。它是所有底层绘制、选择、历史记录操作的入口详见 CanvasAPI 教程。svgEditor.canvas.bind(eventName, callback)Canvas 事件监听方法。签名canvas.bind(eventName, callback)用于订阅下文「Canvas 事件」一节列出的所有事件。svgEditor.ready(function () {})编辑器就绪回调方法。任何svgEditor.ready(cb)注册的回调都会被排队直到编辑器初始化完成runCallbacks执行完毕才被调用若编辑器已就绪回调会被立即执行。回调不接收任何参数。其底层实现位于 src/editor/Editor.jsready(cb)在isReady为false时把[cb, resolve, reject]推入this.callbacks队列并返回 PromiserunCallbacks()则通过Promise.all依次执行所有回调全部成功后置isReady true。在 src/editor/EditorStartup.js 中ready()也被内部用于「加载完成后自动点击初始工具、设置标尺/网格等首选项」的场景init()末尾还会派发同文档的svgedit:ready自定义事件携带detail: this供测试与调试钩子使用。四、扩展事件Extension events大多数扩展需要在特定事件发生时运行自己的逻辑。扩展事件通过svgCanvas.runExtensions(eventName, data)触发事件列表以vars参数的形式在runExtensions的 JSDoc 中声明事件处理方法的返回值需符合ExtensionStatus枚举如返回 Promise、false以跳过默认行为等。这些事件均是可选的。从源码调用点可以看出扩展事件与 Canvas 事件是两条并行的通知通道例如 src/editor/Editor.js 的elementChanged在收到changedCanvas 事件后调用runExtensions(elementChanged, { elems })selectedChanged对应调用runExtensions(selectedChanged, {...})此外还有elementTransition、elementRenamed、beforeClear、afterClear、zoomChanged、langChanged等。一个扩展只需在init()返回的对象中提供与事件同名的回调函数即可挂钩具体扩展写法见 ExtensionDocs 教程。五、Canvas 事件bind与call机制Canvas 事件是编辑器与画布之间传递消息的底层通道主要面向「单独使用 Canvas」的开发者与 SVG-Edit 自身开发。理解它需要掌握两个方法bind(eventName, callback)绑定回调返回之前绑定在该事件名上的旧回调若有。实现见 packages/svgcanvas/svgcanvas.js内部只是const old this.events[ev]; this.events[ev] f; return old。call(eventName, arg)触发事件将window对象与单个事件参数传给回调。实现见 packages/svgcanvas/svgcanvas.jsif (this.events[ev]) return this.eventsev。因此回调的统一签名是callback(win, data)data随事件类型不同而不同见GenericCanvasEvent类型定义。5.1 完整事件清单下表汇总了当前svgcanvas.js中定义与触发的全部 Canvas 事件并标注了它们在编辑器之外的定义/触发位置依据官方文档与仓库源码整理事件名编辑器之外的定义/绑定位置编辑器之外的触发位置changed—draw.js、ext-arrows.js、ext-foreignObject.js、ext-markers.js、ext-polygon.js、ext-star.js、path.jsclearedSVG-Edit 中未绑定/未定义—contextset—仅由draw.js触发exported——exportedPDF——extension_added——extensions_added—仅由svg-editor.js触发message仅ext-webappfind.js仅由svg-editor.js触发pointsAddedSVG-Edit 中未绑定/未定义—saved——selected—另由path.js触发setnonce仅ext-arrows.js—transition——updateCanvas——unsetnonce仅ext-arrows.js—zoomed——zoomDone——5.2 编辑器内部的实际绑定与调用编辑器启动时在 src/editor/EditorStartup.js 批量订阅了大量 Canvas 事件是理解各事件数据形态的最佳参考selected→selectedChanged(win, elems)elems为被选中元素数组据此更新顶栏属性面板与上下文菜单transition→elementTransition(win, elems)元素在鼠标拖拽旋转/移动过程中的中间状态changed→elementChanged(win, elems)任一元素发生变化置showSaveWarning true刷新上下文面板并调用扩展的elementChangedexported→exportHandler(win, data)读取data.issues、data.bloburl/data.datauri在新窗口中打开导出结果并提示导出注意事项exportedPDF→ 处理data.output与data.exportWindowName在exportWindow中展示 PDFzoomed/zoomDone→ 更新缩放输入框、重算选择框尺寸与线框样式updateCanvas→ 接收{ center, newCtr }更新工作区滚动与标尺contextset→ 更新面包屑式上下文导航栏extension_added→ 将扩展的工具按钮注册进左侧工具栏另有elementRenamed、clipboardChanged、resolveClipboardConflicts、beforeClear、afterClear等。触发侧call的实例同样可以在 packages/svgcanvas/svgcanvas.js 中看到例如画布清空前后分别this.call(beforeClear)与this.call(afterClear)添加锚点后this.call(pointsAdded, { closedSubpath, grips })、this.call(selected, grips)元素变化后this.call(changed, [elem])扩展注册完成后this.call(extension_added, extObj)extensions_added则在 src/editor/EditorStartup.js 由编辑器在扩展加载完成后显式svgCanvas.call(extensions_added)触发进而将messageQueue中积压的消息逐条以call(message, messageObj)转发给扩展。5.3 与扩展事件的联动两类事件最终会汇合编辑器对每个重要 Canvas 事件既更新自身 UI也通过runExtensions通知扩展扩展事件名与 Canvas 事件名不同如elementChanged之于changed。因此如果你只做嵌入集成使用canvas.bind即可如果编写扩展则应优先实现扩展事件回调保持与 SVG-Edit 扩展生态一致的约定。六、实践建议与常见误区区分监听层级宿主页面用svgEditorReadysvgCanvas直接操作帧内脚本用svgEditor.ready与svgEditor.canvas.bind扩展用runExtensions对应事件回调。三层不可混用。bind的返回值bind会返回旧回调可用于「保存上一个监听者并还原」的临时替换模式但注意它只允许单回调——后绑定的会覆盖先绑定的。回调参数顺序Canvas 事件回调始终是(win, data)win为window对象data为事件特有数据svgEditor.ready回调则无参数。setCustomHandlers的覆盖范围open、save、exportImage、exportPDF均可覆盖只覆盖save不影响其他默认行为默认exportHandler见 src/editor/Editor.js。svgEditorReady的派发目标事件派发在宿主文档的documentElement上且带bubbles: true因此监听document即可捕获跨域场景下该派发被try/catch保护不会影响编辑器自身启动。以上全部接口均可在仓库源码与类型定义packages/svgcanvas/svgcanvas.d.ts中找到对应声明可结合 EditorAPI 教程 与 CanvasAPI 教程 进一步阅读。赞分享前端图形学【免费下载链接】svgeditPowerful SVG-Editor for your browser项目地址https://gitcode.com/gh_mirrors/sv/svgedit点击查看免费下载相关推荐Alpine.js事件系统完整指南从x-on到自定义事件处理Alpine.js事件系统完整指南从x on到自定义事件处理 Alpine.js是一个轻量级但功能强大的JavaScript框架专门为在HTML标记中编写交前端LogicFlow 事件系统完全指南从事件监听到自定义事件实战LogicFlow 事件系统完全指南从事件监听到自定义事件实战 导读 本文以 LogicFlow 官方基础教程《Event》为核心系统讲解流程图编辑器的事件前端低代码流程编排vim-airline鼠标事件绑定自定义事件处理vim airline鼠标事件绑定自定义事件处理 在使用Vim编辑器时你是否曾想过通过鼠标与状态栏进行交互vim airline作为一款轻量级的状态栏插件开发工具UI组件上一篇Redux Thunk与React Suspense错误处理优雅降级下一篇Android Sunflower 布局约束优化终极指南Android Studio Lint 助力高效开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
接网站开发私活如何签合同进阶技巧 接网站开发私活如何签合同避坑指南含免费工具 找建站公司怕被坑高价?接私活最怕合同模糊导致返工扯皮,用这款免费工具核对条款能省一半心机。 威胁场景:合同模糊引发的信任崩塌… · 2026/9/27 21:22:13
Windows 远程控制 Linux 实战:TaoToken 统一 Key 打通 AI 终端配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 21:22:13
如何维护wordpress报价多少钱 新手从零搭建WordPress后,这3招教你低成本维护 手里没代码,心里想做个网站,这大概是90%中小企业主的常态。别被那些满屏的技术名词吓住,WordPress其实是目前市面上对非技术人员最友好的开源建站系统。很多老板以为建站只是买套模板… · 2026/9/27 21:58:04
从零搭建官网:搞懂网络营销推广的渠道是什么再谈安全 从零搭建官网:搞懂网络营销推广的渠道是什么再谈安全 别再说自己不会代码就搞不定网站了。很多后端新手卡在“从零搭建”这一步,以为写个后端接口就算完事,结果上线第一天就被爬虫扫出漏洞,或者流量全被低质渠道吸走。今天不聊虚的,直接拆解:当你在… · 2026/9/27 21:58:04
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01