拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Jspreadsheet 富文本 HTML 编辑器列类型实战指南:在数据表格中嵌入富文本内容

Jspreadsheet 富文本 HTML 编辑器列类型实战指南:在数据表格中嵌入富文本内容
  • 前端
  • UI组件

【免费下载链接】ce

Jspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.

项目地址:https://gitcode.com/gh_mirrors/ce/ce
点击查看免费下载

本指南围绕 Jspreadsheet(v4)的html列类型展开,讲解如何为数据网格添加富文本(Rich Text / HTML Editor)单元格:你既可以在初始化数据中用内嵌 HTML 直接渲染带图片、加粗、链接等格式的内容,也可以在双击单元格后调用基于 Jsuites 的所见即所得 HTML 编辑器进行在线编辑。读完本文你将掌握html列的定义方法、富文本编辑器从打开到保存的完整生命周期,以及它与普通文本列的渲染差异和进阶用法。

为什么需要富文本列

普通电子表格单元格只能承载纯文本。但在文档管理、CMS 内容编辑、商品描述维护、新闻稿管理等场景中,单元格里往往需要存放带格式的正文:标题加粗、段落换行、嵌入产品图片、甚至包含超链接。Jspreadsheet 的html列类型正是为此设计的——它让单元格既能展示完整的 HTML 内容,又能在编辑模式下提供真正的富文本编辑体验。

从源码结构看,这个能力是 Jspreadsheet 与 Jsuites 两个库协同的结果:Jspreadsheet 负责列类型分派、单元格渲染与数据回写,Jsuites 负责弹出式 HTML 编辑器(jSuites.editor)。二者的协作逻辑集中体现在 src/utils/editor.js 中。

最小示例:一列文字一列 HTML

官方 v4 示例 richtext-html-editor.md 给出了完整可运行的页面,核心思路是:加载 jspreadsheet 与 jsuites 的脚本和样式,用二维数组定义数据,其中第二列的类型声明为html:

<html> <script src="https://bossanova.uk/jspreadsheet/v4/jspreadsheet.js"></script> <link rel="stylesheet" href="https://bossanova.uk/jspreadsheet/v4/jspreadsheet.css" type="text/css" /> <script src="https://jsuites.net/v5/jsuites.js"></script> <link rel="stylesheet" href="https://jsuites.net/v5/jsuites.css" type="text/css" /> <div id="spreadsheet"></div> <script> let options = { data: [ [ 'the Sorcerer`s Stone', '<img align="left" style="width:100px" src="data:image/jpeg;base64,..."><span>On his 11th birthday, <b>Harry</b> receives a letter inviting him to study magic at the Hogwarts School of Witchcraft and Wizardry. <b>Harry</b> discovers that not only is he a wizard, but he is a famous one. He meets two best friends, Ron Weasley and Hermione Granger, and makes his first enemy, Draco Malfoy.</span>' ] ], columns: [ { type:'text', width:200, title:'Title' }, { type:'html', width:400, title:'HTML' }, ], minDimensions:[2,2], } jspreadsheet(document.getElementById('spreadsheet'), options); </script> </html>

配置要点

配置项示例值说明
data二维数组每一行是一个数组,列值按columns顺序排列;html列的值是包含标签的 HTML 字符串
columns[x].type'html'声明第 x 列为富文本列,这是启用富文本能力的关键
columns[x].title'HTML'列表头标题
columns[x].width400列宽(像素),富文本列建议留足宽度以便图文混排
minDimensions[2,2]初始最少渲染 2 行 2 列,保证表格可见

示例中第一列(text)放书名,第二列(html)放一段带内嵌图片和<b>加粗标签的小说简介。这样初始化后,表格会直接把这串 HTML 渲染为图文并茂的单元格,而不是显示为源码字符串。

运行方式

将上述 HTML 保存为本地文件后,任意静态服务器即可运行,例如在仓库根目录执行:

npm install npm run start

然后在浏览器访问本地服务地址即可看到渲染结果。构建打包则使用npm run build(参见 README.md 中的说明)。

从双击到保存:html 编辑器的打开与关闭流程

html列的真正价值在于双击单元格即可进入富文本编辑。这一过程由 src/utils/editor.js 中的编辑器分派逻辑驱动,分为“打开编辑器”与“关闭编辑器并取值”两个阶段。

打开编辑器:jSuites.editor 的挂载与定位

当用户双击(或通过 API 触发编辑)某个单元格时,src/utils/editor.js 会对type == 'html'的列做如下处理:

  1. 以当前单元格数据obj.options.data[y][x]作为编辑器的初始value;
  2. 创建一个div编辑器容器,并在其中挂载一个带jss_richtext类名的子元素;
  3. 调用jSuites.editor(div, { focus: true, value: value })初始化 Jsuites 富文本编辑器并立即聚焦;
  4. 通过getBoundingClientRect()计算单元格与编辑器尺寸,做视口边缘防溢出定位:当编辑器会超出窗口底部时,向上偏移;当会超出窗口右侧时,向左偏移,保证编辑器始终完整可见。

对应的 src/jspreadsheet.css 中定义了.jss_richtext的样式:默认position: fixed、高z-index: 40、带 Material 风格阴影、白底、10px 内边距,并开启字体平滑渲染,使其悬浮在表格上方形成独立编辑层。

关闭编辑器:通过 editor.getData() 回写数据

编辑结束(例如点击其他单元格、按回车或点击外部区域)时,src/utils/editor.js 会执行:

value = cell.children[0].children[0].editor.getData();

即从 Jsuites 编辑器实例中取出编辑后的 HTML 内容。随后若新值与旧值不同,则调用obj.setValue(cell, value)把 HTML 写回数据源并刷新单元格显示(src/utils/editor.js)。

渲染差异:html 列与普通文本列

同样是“把值放进单元格”,html列与普通列在渲染路径上有本质区别。查看 src/utils/internal.js 的单元格渲染逻辑:

  • html列:直接执行td.innerHTML = stripScript(parseValue(...)),把 HTML 字符串当作真实标签渲染;
  • 普通列:仅在全局配置parseHTML === true时才使用innerHTML,否则一律td.textContent(纯文本)。

也就是说,只有在声明为html类型的列上,HTML 字符串才会无条件被解析渲染;其他列默认把 HTML 当作文本显示。setValue更新数据时同样遵循这一分支(src/utils/internal.js)。

stripScript 安全过滤

无论初始渲染还是编辑回写,html列的值都会经过stripScript处理(见 src/utils/internal.js 与 src/utils/internal.js)。从实现看,该函数用于剥离<script>类脚本标签,避免富文本内容注入可执行脚本,这是将用户输入的 HTML 写入innerHTML时的必要防线。

富文本列的其他实用细节

  • 换行与长内容换行:html列同样遵循 Jspreadsheet 的 wordWrap 规则——当单元格innerHTML长度超过 200 个字符时,会自动应用white-space: pre-wrap以支持换行显示(见 src/utils/internal.js),长富文本不会被挤压成一整行。
  • 公式与编辑器共存:编辑事件处理中,html列与calendar列一起被列入特殊编辑器清单(见 src/utils/events.js),说明框架已对这类“独立弹层编辑器”的键盘/焦点行为做了统一协调,双击进入编辑时不会干扰公式列或普通输入列。
  • 数据获取:编辑结束后 HTML 内容会直接写回options.data数组,因此通过常规数据读取 API 拿到的就是最终保存的 HTML 字符串,可直接提交给后端或用于后续渲染。

进阶:在富文本中嵌入图片

示例数据中展示了两种常用手法:

  1. 内嵌 Base64 图片:<img src="data:image/jpeg;base64,...">直接把图片数据打包进 HTML,适合小图、无需额外请求、数据自包含的场景;
  2. HTML 排版标签混排:<span>包裹正文、<b>加粗关键词,配合align="left"和style="width:100px"实现图文并排。

在编辑器中,Jsuites 的富文本工具栏还允许用户直接插入本地图片(以 Base64 形式嵌入),编辑保存后这些图片会随 HTML 一起存回单元格数据。

总结

Jspreadsheet v4 的html列类型通过三件事解决了“表格内富文本”这一需求:

  • 渲染层:html列直接以innerHTML渲染数据,并统一经过stripScript过滤脚本;
  • 编辑层:双击单元格后挂载 Jsuites 富文本编辑器,实现所见即所得编辑;
  • 数据层:关闭编辑器时通过editor.getData()取回 HTML,写回数据源,保持单元格显示与底层数据一致。

需要参考完整示例源码时,可查看仓库中的 docs/jspreadsheet/v4/examples/richtext-html-editor.md,并对照 src/utils/editor.js、src/utils/internal.js 与 src/jspreadsheet.css 中的实现细节。

  • 前端
  • UI组件

【免费下载链接】ce

Jspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.

项目地址:https://gitcode.com/gh_mirrors/ce/ce
点击查看免费下载

相关推荐

上一篇:SeaTunnel ObsFile Sink 连接器完整指南:华为云 OBS 多格式文件写入与精确一次语义
下一篇:StarRocks crc32 字符串函数详解:语法、源码实现与数据校验实战

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表