必须对表格单元格内容做HTML实体转义,且需按&→&、<→<、>→>、"→"、'→'顺序处理,否则嵌套转义会导致显示异常;动态填充时用textContent可原样显示已转义字符串,innerHTML则会解析渲染,仅适用于可信数据。

表格里直接写 <div> 会被当成标签解析,写 "hello" 可能丢引号,甚至空格塌缩——这不是渲染 bug,是 HTML 本来的规则。必须对单元格内容做转义,且不能只靠 <pre> 或 CSS。
table 单元格里显示原始 HTML 字符串
表格不是代码块容器,<td><div></div></td> 里的 < 和 > 会被浏览器当作真实标签处理,哪怕它在 <td> 里。要让它原样显示,就得提前转义成实体。
-
<→ -
>→> -
&→& -
"→" -
'→'
注意:必须按这个顺序转义,否则 里的 <code>& 如果后转,会变成 —— 多转一次就多一层,最终页面显示的是 <code> 而不是 <code><。
用 JavaScript 动态填充表格时的常见翻车点
很多人用 cell.innerText = rawString,以为安全,结果发现 显示成字面量、<script> 被过滤、引号消失……这是因为 innerText 会把所有 HTML 实体当纯文本,不解析;而 innerHTML 又可能执行脚本。
立即学习“前端免费学习笔记(深入)”;
- 想展示原始字符串(含已转义实体)→ 用
textContent,它不解析任何实体,也不执行 JS - 想让
渲染为空格、©渲染为 © → 用innerHTML,但仅限可信数据 - 服务端返回的是已转义字符串(如 Python 的
html.escape()输出),前端别再手动.replace(),否则叠两层转义
示例:cell.textContent = "<div>test</div>" → 页面显示 <div>test</div>;而 cell.innerHTML = "<div>test</div>" → 页面显示一个真实 <div> 标签并执行。
空格、换行、不间断空格在表格中的表现差异
表格默认 white-space: normal,连续空格/制表符/换行都会被合并成一个空格。想保留格式,得干预 CSS 或改用实体。
- 单个空格 → 直接敲空格,或用
(不可折行) - 多个连续空格 → 必须用多个
,不能靠缩进或空格键 - 换行 →
<br>在innerHTML中有效;textContent里换行符只是 \n,需配合white-space: pre-line - 表格列宽受限时,
不折行,可能撑破布局;/更可控
推荐做法:给 <td> 加 style="white-space: pre-wrap;",然后用 textContent 填入带 \n 和空格的字符串,比堆 更干净。
最易被忽略的是转义顺序和来源可信度:后端传来的字符串是否已 escape?前端又做了几轮 replace? 这种嵌套转义,往往查半天才发现是双写导致的。表格本身不提供转义能力,全靠你控制输入流。



















