D3.js链式调用中.append('path')未执行且无报错问题咨询
D3.js无报错前提下链式调用中断的通用场景
相关问题代码:
const pie = g.selectAll("path") .data(pie(chartData)) .enter() .append("g") // 该步骤正常执行,元素成功追加 .on("click", (d, i) => onSliceClick(i)) // 点击事件绑定正常 .append("path") // 该行及之后的所有链式调用都不会执行
以下是符合无报错、前置步骤正常、后续链式调用不触发特征的通用场景:
- SourceMap映射偏差:从行号特征可以判断你调试的是打包后的编译产物,如果SourceMap与实际运行的代码不匹配,会出现断点打在错误位置的情况,你看到的
.append("path")行实际上对应的是其他未执行的逻辑,而代码本身可能已经正常执行,可以通过打印最终的pie变量是否为path选择集验证该情况。 - 全局错误被静默捕获:如果
.on()方法或者后续链式调用抛出了错误,但项目接入的前端监控SDK、框架全局错误捕获逻辑将错误吞掉没有在控制台打印,就会出现无报错的假象,你可以在.on()方法前加try catch包裹,手动捕获错误验证。 - D3选择集原型被修改:如果项目中有全局修改D3
selection.on原型方法的逻辑,且自定义逻辑没有返回当前选择集(return this),会导致.on()调用后返回非选择集值,后续的.append()不会执行,若返回的是普通对象且未定义append方法,又被全局错误捕获吞掉报错,就会匹配该问题特征。 - enter选择集实际为空:如果该段代码重复执行,第一次执行已经生成了对应数量的path元素,第二次执行时
selectAll("path")匹配到了已存在的元素,enter选择集长度为0,后续所有链式调用都不会执行。你看到的g元素和绑定的点击事件是第一次执行的结果,你可以在.enter()后调用.size()打印选择集长度验证该情况。 - 变量名冲突:你代码中保存选择集的变量名
pie与饼图布局生成器的变量名完全一致,若二者处于同一作用域,在部分旧版本编译工具转义时会出现逻辑异常,导致中间选择集被提前释放,链式调用中断,可将保存选择集的变量重命名为其他名称验证。
内容的提问来源于stack exchange,提问作者JmJ
相关产品推荐
相关产品推荐

