表格单元格里可直接输入文字、数字、公式等内容,支持格式设置与数据验证,便于快速编辑和展示信息。

表格单元格里直接写
因为浏览器在解析 <td> 内容时,会把 当成标签起始符、<code>& 当成实体开头——哪怕你只是想显示字符串 "5 或 <code>"price & stock"。不转义就会触发提前闭合、内容截断,甚至 DOM 结构崩坏。
- 常见现象:
<tr><td>user<script>alert(1)</script></td></tr>渲染后只剩user,后面脚本可能执行 - 根本原因不是“表格特殊”,而是所有 HTML 文本节点都遵循同一套解析规则
- 必须转义的只有 5 个字符:
&、、<code>>、"、',顺序不能错:先&,再和 <code>>,最后引号
用 textContent 填表格最省心
如果你只需要原样显示纯文本(比如用户昵称、数值、描述),直接设 textContent 就行,浏览器不会解析,也不用你手动转义。
-
cell.textContent = data.name;→ 安全、保留空格换行、无 XSS 风险 - 适合绝大多数场景:数据列表、后台管理表格、日志展示
- 注意:
innerText会触发重排、丢失隐藏内容,优先用textContent - 不要混用:
cell.textContent = '<div>test</div>'显示的就是字面量,不是渲染后的<div>
必须用 innerHTML 时怎么安全插入
当你要在表格里渲染富文本(如带 <strong> 的摘要、高亮关键词),就不能只靠 textContent,但直接拼接字符串极危险。
- 别写:
cell.innerHTML = '<td>' + userContent + '</td>'—— 这是 XSS 入口 - 正确做法:逐单元格创建元素,对纯文本部分用
textContent,对可信 HTML 部分做白名单清洗(允许<b>、<i>,禁用<script>、onerror) - 服务端已转义的数据(如 Python 的
html.escape()输出),前端若用innerHTML插入,得先DOMPurify.sanitize()或html.unescape()还原再清洗,否则显示的是字面量
属性值里的特殊符号容易被忽略
表格列头常带 title,行数据常带 data-* 属性,这些地方的引号和 & 同样要处理,否则属性提前截断。
立即学习“前端免费学习笔记(深入)”;
-
<th title="User's input: <script>...">→ 单引号没转,属性在's就结束了,后面脚本真会执行 - 正确写法:
title="User's input: <script>"</script>或用 JS 动态设置:th.setAttribute('title', str)(它自动处理引号,但不转<和&) -
data-filter="price > 100"必须转义>,否则>被当成属性值结束符
真正麻烦的从来不是“要不要转义”,而是上下文切换时忘了判断:这个字符串接下来是进 textContent,还是进 innerHTML,还是塞进属性值?漏掉任意一环,轻则显示错乱,重则执行任意代码。



















