You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 => ({
        '&': '&amp;', '<': '&lt;', '>': '&gt;',
        '"': '&quot;', "'": '&#39;'
      }[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:03:05