D3代码在Chrome/iCab异常:DOM Exception 12,文本插入失效求助
解决iCab中D3文本插入抛出DOM Exception 12的问题
DOM Exception 12本质是无效字符错误(Invalid Character Error),iCab作为偏老旧的浏览器,对DOM文本节点的创建和字符兼容性要求比Safari/Firefox严格得多。既然地图能正常渲染,说明SVG路径、数据加载的核心逻辑没问题,问题肯定出在文本插入的环节,给你几个具体的排查和解决方向:
1. 先排查文本内容里的特殊字符
iCab对非标准ASCII字符(比如特殊符号、乱码字符、甚至某些Unicode emoji)的支持很差,很容易触发这个错误。你可以:
- 遍历
postcards或wards数据里的文本字段,检查有没有奇怪的字符; - 在插入文本前手动转义特殊字符,比如写个简单的转义函数:
function safeText(text) { // 转义HTML特殊字符,避免DOM解析报错 return text ? text.replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c])) : ''; } // 替换原来的text()调用 svg.append("text") .text(d => safeText(d.yourTextProperty));
2. 换一种文本插入的DOM操作方式
D3的text()方法在旧浏览器里可能有兼容问题,试试用原生DOM API创建文本节点:
svg.append("text") .each(function(d) { // 用原生方法创建文本节点,绕过D3的封装逻辑 const textNode = document.createTextNode(d.yourTextProperty); this.appendChild(textNode); });
3. 检查SVG文本的属性设置
iCab对SVG文本的属性支持也很挑剔:
- 避免使用太新的自定义字体,改用系统默认字体(比如
font-family: sans-serif); - 确保
x、y这些位置属性是纯数值,不要带单位或非数值内容; - 不要用
textPath这类iCab可能不支持的SVG特性。
4. 修正数据加载的错误处理
你提供的代码片段里有个小笔误:第二个回调里的错误判断写的是if(err...,应该是if(error),这会导致数据加载的错误没被捕获,建议修正成:
d3.json("/sites/default/d3_files/json/toronto-wards.json", function(error, wards) { if (error) { console.error('加载 wards 数据失败:', error); return; } d3.json("/postcards-json", function(error, postcards) { if (error) { console.error('加载 postcards 数据失败:', error); return; } // 后续渲染逻辑 }); });
这样能在iCab控制台看到具体的加载错误,避免隐藏问题。
5. 检查D3版本兼容性
如果你用的是D3 v4+,里面的ES6语法(比如箭头函数、let/const)可能在iCab里不兼容,试试降级到D3 v3,或者把代码里的ES6语法改成ES5写法(比如把() => {}换成function() {})。
按照这个顺序排查,应该能快速定位到问题——大概率是文本内容里的特殊字符触发了iCab的严格检查,先从转义文本开始试。
内容的提问来源于stack exchange,提问作者PatriciaW
相关产品推荐
相关产品推荐

