Jspreadsheet 自定义列类型实战:基于第三方 jQuery 插件(Spectrum 颜色选择器)扩展单元格编辑器

发布时间:2026/9/29 6:14:18
Jspreadsheet 自定义列类型实战:基于第三方 jQuery 插件(Spectrum 颜色选择器)扩展单元格编辑器
前端UI组件【免费下载链接】ceJspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.项目地址https://gitcode.com/gh_mirrors/ce/ce点击查看免费下载Jspreadsheetv2 时代亦称 jExcel允许开发者基于任意第三方 jQuery 插件打造自定义列类型从而为单元格提供远超内置输入框的交互能力。本文以官方示例「集成 Spectrum 颜色选择器」为主体完整讲解自定义编辑器对象的四个核心方法契约、jExcel 在源码层面的调度机制src/utils/editor.js并给出可直接运行的完整 HTML 示例读完即可将任意 jQuery 插件接入自己的表格。一、为什么需要自定义列类型Jspreadsheet 内置了text、numeric、hidden、dropdown、autocomplete、checkbox、calendar等常用列类型完整列表参见 初始化参数与列类型文档但它们只能覆盖通用输入场景。当业务需要专用输入控件——例如颜色选择器、评分组件、文件上传器、富文本编辑器——时jExcel 从 v2 开始就提供了一条开放扩展路径将第三方 jQuery 插件封装成一个自定义编辑器对象通过列配置中的editor或type属性挂载到指定列上jExcel 会在进入/退出编辑时自动调用该对象的生命周期方法。官方示例 Create a custom column based on a third party jquery plugin 就是这条扩展路径的完整演示基于 Spectrum jQuery 颜色选择器插件构建一个「自定义颜色列」。二、完整示例基于 Spectrum 的颜色选择器列以下是官方文档提供的完整源码可直接保存为 HTML 运行。它包含两部分spectrumEditor自定义编辑器对象以及将{ type: text, editor: spectrumEditor }绑定到第二列的表格初始化。html script srchttps://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js/script script srchttps://cdnjs.cloudflare.com/ajax/libs/spectrum/1.8.0/spectrum.min.js/script link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/spectrum/1.8.0/spectrum.min.css typetext/css / script srchttps://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/js/jquery.jexcel.js/script link relstylesheet hrefhttps://cdnjs.cloudflare.com/ajax/libs/jexcel/2.1.0/css/jquery.jexcel.min.css typetext/css / div idmy/div script var spectrumEditor { // Methods closeEditor : function(cell, save) { // Get value var value $(cell).find(.editor).spectrum(get).toHexString(); // Set visual value $(cell).html(value); $(cell).css(color, value); // Close edition $(cell).removeClass(edition); // Save history return value; }, openEditor : function(cell) { // Get current content var html $(cell).html(); // Create the editor var editor document.createElement(div); $(cell).html(editor); $(editor).prop(class, editor); // Create the instance of the plugin $(editor).spectrum({ color:html, preferredFormat:hex, hide: function(color) { // Close editor $(# $.fn.jexcel.current).jexcel(closeEditor, $(cell), true); }}); // Run $(editor).spectrum(show); }, getValue : function(cell) { return $(cell).html(); }, setValue : function(cell, value) { $(cell).html(value); $(cell).css(color, value); return true; } } let data [ [Google, #542727], [Yahoo, #724f4f], [Bing, #b43131], ]; $(#my).jexcel({ data:data, colHeaders: [ Name, Custom color ], colWidths: [ 300, 200 ], columns: [ { type: text }, { type: text, editor:spectrumEditor }, ] }); /script /html运行效果第二列每个单元格显示为一段带颜色的十六进制色值双击单元格后弹出 Spectrum 调色板选取颜色并关闭调色板后色值与文字颜色同步更新同时单元格写入表格数据并进入历史记录。三、自定义编辑器对象的接口契约jExcel v2 要求自定义编辑器对象实现以下四个方法v2 入门文档「Custom type」小节 给出了同样的方法集合方法调用时机参数说明返回openEditor(cell)用户开始编辑单元格时cell被编辑的单元格 DOM 元素无closeEditor(cell, save)编辑结束时cell单元格 DOMsave是否保存本次编辑保存的值savetrue时getValue(cell)读取单元格原始值cell单元格 DOM单元格当前值setValue(cell, value)向单元格写入值cell单元格 DOMvalue新值true表示成功结合 editors 文档当前版本v5 CE的自定义编辑器在此基础上扩展了更完整的生命周期方法方法说明createCell(cell, value, x, y, instance, options)新单元格创建时触发updateCell(cell, value, x, y, instance, options)单元格值变化时触发openEditor(cell, value, x, y, instance, options)用户开始编辑时触发closeEditor(cell, confirmChanges, x, y, instance, options)用户结束编辑时触发destroyCell(cell, x, y, instance)单元格销毁时触发get(options, value)将原始数据转换为展示数据例如把 ID 渲染为名称也就是说v2 示例中的四方法契约是这一完整接口的核心子集v2 用type: text, editor: spectrumEditor挂载而 v5 直接支持columns[x].type传入对象见下文源码分析。四、源码级原理jExcel 如何调度自定义编辑器理解了接口后再看 jExcel 内部如何调用这些方法能让自定义编辑器写得更加健壮。核心逻辑集中在 src/utils/editor.js。1. openEditor进入编辑状态的分发入口openEditor首先读取单元格的data-x/data-y定位行列触发oneditionstart事件然后把当前单元格的原始 HTML 快照存入obj.edition用于取消编辑时还原。接着判断列类型// src/utils/editor.js#L55-L60 if (obj.options.columns obj.options.columns[x] typeof obj.options.columns[x].type object) { // Custom editors obj.options.columns[x].type.openEditor(cell, obj.options.data[y][x], parseInt(x), parseInt(y), obj, obj.options.columns[x], e); // On edition start dispatch.call(obj, oncreateeditor, obj, cell, parseInt(x), parseInt(y), null, obj.options.columns[x]); }关键点判断条件是typeof columns[x].type object——这正是示例中editor: spectrumEditor生效的底层依据v2 初始化时会把这个对象合并为列的type从而进入自定义编辑器分支该分支会依次把当前单元格原始值、行列坐标、表格实例、列配置传给openEditor因此自定义编辑器可以拿到上下文做更复杂的初始化紧接着派发oncreateeditor事件编辑器创建过程可被外部监听事件签名见 editors 文档。作为对比同函数中type color或type calendar等原生类型走的是jSuites.color/jSuites.calendar内置实现src/utils/editor.js。自定义编辑器的本质就是把这段插件实例化逻辑交还给你自己。2. closeEditor保存与取消的分发入口编辑结束时closeEditor同样先检查列类型是否为对象// src/utils/editor.js#L288-L290 if (obj.options.columns obj.options.columns[x] typeof obj.options.columns[x].type object) { // Custom editor value obj.options.columns[x].type.closeEditor(cell, save, parseInt(x), parseInt(y), obj, obj.options.columns[x]); }要点当savetrue时jExcel 会把自定义closeEditor的返回值作为该单元格的新值随后与快照对比若值未变化则还原原始 HTML否则调用obj.setValue(cell, value)写入数据并记入历史示例代码里return value这一步因此必不可少无论保存与否结束后都会派发oneditionend事件并移除单元格的editor样式类示例中 Spectrum 调色板关闭时调用$(# $.fn.jexcel.current).jexcel(closeEditor, $(cell), true)$.fn.jexcel.current是当前活动表格实例的 DOM id通过公开方法closeEditor触发同一套保存流程——这也是 quick-reference 文档 中表格方法的典型用法当前版本中openEditor/closeEditor已作为 worksheet 实例方法对外暴露见 src/utils/worksheets.js。3. 编辑生命周期事件自定义编辑器与事件系统完全打通可以这样使用事件触发时机回调签名oneditionstart进入编辑前(worksheet, cell, x, y)oncreateeditor编辑器创建后(worksheet, cell, x, y, input, options)oneditionend编辑结束无论保存与否(worksheet, cell, x, y, v, save)事件的完整注册方式与更多行为配置可参考 editors 文档。五、实现自定义编辑器的方法要点基于示例代码与源码逻辑编写自定义编辑器时需要注意以下细节编辑器 DOM 约定openEditor中建议清空单元格内容并注入一个带.editorclass 的容器元素closeEditor中再通过$(cell).find(.editor)定位插件实例读取值——示例中的容器写法是官方推荐模式值回写与视觉呈现closeEditor在保存前应先把值写回单元格如$(cell).html(value)这样即使savefalse取消编辑jExcel 也能基于obj.edition[1]快照正确还原历史记录保存的值由closeEditor返回值决定jExcel 在 src/utils/editor.js 中比较新旧值后调用setValue并记入历史因此自定义编辑器天然支持 undo/redo隐藏关闭入口第三方插件如 Spectrum通常有自己的关闭交互必须在其hide/close回调里显式调用closeEditor否则编辑状态无法结束当前实例引用多表格并存时用$.fn.jexcel.current指向当前活动实例避免在回调闭包中引用错误的表格。六、进阶渲染层与原生能力对比除编辑器外列配置还支持render函数用于非编辑状态的展示逻辑例如按值渲染徽标或图标// src/utils/columns.js#L234-L236 if (obj.options.columns obj.options.columns[col] typeof obj.options.columns[col].render function) { obj.options.columns[col].render(td, value, parseInt(col), parseInt(row), obj, obj.options.columns[col]); }render与自定义编辑器可组合使用前者负责单元格静态展示后者负责交互输入。此外当前版本已内置color列类型底层为 jSuites 颜色选择器见 src/utils/editor.js若需求恰好是取色直接使用{ type: color }即可而当内置控件无法满足需求时本文的自定义编辑器方案是通用解法。七、相关资源官方示例Create a custom column based on a third party jquery pluginv2 入门文档Custom type 小节Getting started with the jquery plugin初始化参数与实例方法速查Quick Reference编辑器接口与事件v5 CESpreadsheet Cell Editors编辑器调度源码src/utils/editor.js工作表实例方法openEditor/closeEditor 对外暴露src/utils/worksheets.js列渲染函数src/utils/columns.js全部示例索引Examples赞分享前端UI组件【免费下载链接】ceJspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.项目地址https://gitcode.com/gh_mirrors/ce/ce点击查看免费下载相关推荐JspreadsheetjExceljQuery 插件快速入门三种数据源初始化、列类型与自定义编辑器实战指南JspreadsheetjExceljQuery 插件快速入门三种数据源初始化、列类型与自定义编辑器实战指南 Jspreadsheet 是一个轻量级的 J前端UI组件FunASR Python SDK 实战指南AutoModel 从首次转录到 VAD、标点、说话人分离与自定义模型注册FunASR Python SDK 实战指南AutoModel 从首次转录到 VAD、标点、说话人分离与自定义模型注册 本文以 FunASR 仓库的 Pyth前端UI组件Jspreadsheet CE 单元格编辑器完全指南内置编辑器、自定义编辑器与生命周期事件Jspreadsheet CE 单元格编辑器完全指南内置编辑器、自定义编辑器与生命周期事件 导读 本文以 Jspreadsheet CE社区版的单元格编辑前端UI组件上一篇突破内存瓶颈HunyuanVideo的滑动窗口注意力技术如何实现长视频生成下一篇如何通过Mousecape打造个性化macOS鼠标指针终极自定义指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考