不能用正则replace直接扫文本,因简繁转换是字形映射而非翻译,需预定义双向映射表;否则会漏转异体字(如「着→著」)、误处理非中文字符、破坏input/textarea值及script/style内容,且必须仅遍历TEXT_NODE节点并同步placeholder等特殊文本。

不能靠“自动转换”——简繁不是翻译,是字形映射,必须用预定义的双向映射表,否则「着→著」「裏→裡」这类异体字会漏转或错转。
为什么不能用正则 replace 直接扫文本?
常见错误是写 text.replace(/[\u4e00-\u9fa5]/g, c => map[c]),看似简单,实际踩坑密集:
- 匹配不到多音字、异体字(如「乾→乾/幹」在不同语境下应转不同繁体)
- 把英文、数字、标点也当中文处理,导致
123abc被误替换为空或乱码 - 没跳过
input和textarea的value,用户正在输入的内容被清空 - 遇到
script或style标签内容也被扫,可能破坏逻辑或样式
真正安全的遍历方式:只处理 TEXT_NODE
核心是递归遍历 DOM,但只对 Node.TEXT_NODE 做映射,其他节点跳过或特殊处理:
- 遇到
INPUT或TEXTAREA元素:不改value,但可更新其placeholder属性 - 遇到
SELECT:遍历其option的textContent,不碰value - 跳过
SCRIPT、STYLE、NODE.COMMENT_NODE - 对每个文本节点先用
/[\u4e00-\u9fa5]/.test(text)判断是否含中文,避免空串或纯英文开销
如何让切换状态跨页面保持?
用 localStorage 记录当前模式,而不是 cookie 或 URL 参数:
立即学习“前端免费学习笔记(深入)”;
- 首次加载时读
localStorage.getItem('zh_mode'),为空则 fallback 到navigator.language - 切换按钮点击后,先
localStorage.setItem('zh_mode', 't'),再立即调用转换函数 - 注意:不要在
DOMContentLoaded之前执行转换,否则document.body可能还不存在 - 若页面用 Vue/React 渲染,需在
mounted或useEffect后手动触发,不能依赖初始 HTML
最易被忽略的是 placeholder 和 option 文本的同步更新——它们不属于 textContent,但用户能看见;还有事件监听器不会丢失,前提是别动 innerHTML。



















