- 前端
- UI组件
【免费下载链接】ce
Jspreadsheet is a lightweight JavaScript data grid component for creating interactive data grids with advanced spreadsheet controls.
本指南围绕 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].width | 400 | 列宽(像素),富文本列建议留足宽度以便图文混排 |
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'的列做如下处理:
- 以当前单元格数据
obj.options.data[y][x]作为编辑器的初始value; - 创建一个
div编辑器容器,并在其中挂载一个带jss_richtext类名的子元素; - 调用
jSuites.editor(div, { focus: true, value: value })初始化 Jsuites 富文本编辑器并立即聚焦; - 通过
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 字符串,可直接提交给后端或用于后续渲染。
进阶:在富文本中嵌入图片
示例数据中展示了两种常用手法:
- 内嵌 Base64 图片:
<img src="data:image/jpeg;base64,...">直接把图片数据打包进 HTML,适合小图、无需额外请求、数据自包含的场景; - 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.
相关推荐
Jspreadsheet 富文本列(HTML Editor)实战指南:用 `html` 列类型构建富文本数据网格
Jspreadsheet 富文本列(HTML Editor)实战指南:用 html 列类型构建富文本数据网格 导读 Jspreadsheet(CE 版本,仓库路
前端UI组件Jspreadsheet 实战示例全解析:从 HTML 表格到富文本、列拖拽与 Web Component 集成
Jspreadsheet 实战示例全解析:从 HTML 表格到富文本、列拖拽与 Web Component 集成 导读 本文以 docs/jspreadshee
前端UI组件Notesnook 富文本编辑器:在笔记中插入图片、文件、音频与嵌入内容的完整指南
Notesnook 富文本编辑器:在笔记中插入图片、文件、音频与嵌入内容的完整指南 本指南系统讲解 Notesnook 富文本编辑器中"媒体与附件"能力:如何从
前端移动开发桌面应用应用安全
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考