谷歌翻译问题导致Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node

4 阅读1分钟

背景:

最近我们的系统在做多语言调研,运营测试系统经过谷歌翻译后页面会炸掉,导致如标题报错信息,经过谷歌几篇资料,发现这是个小坑。

原因:

1、谷歌翻译进行翻译的时候会改变真实dom,把文本节点使用span标签包裹,从而进行dom替换,我们系统的table里的文字渲染是没有加任何dom包裹的,谷歌翻译后的节点就会变成parent->span->child,谷歌翻译前的节点为parent->child直接改变了真实dom,导致真实dom和React的虚拟Dom不一致, 2、当谷歌翻译后,我们暴露出来的问题是中文翻译成英文导致expand组件要呈现折叠现象触发了一次更新,根据虚拟dom的diff算法,首先要移出child,于是执行parent.removeChild(childA),但是谷歌翻译后早就改变了真实dom,原父子关系不存在,所以页面会炸掉

解决:

1、多语言提倡用i18n等手段来实现,i18n为纯文本替换 不会改变dom 2、紧急抢救可以给每个暴露的元素用span标签进行包裹,这样的话react在进行diff算法的时候,就会觉得是纯文本替换,就不会移除子节点 从而避开错误。