D3气泡图更新后端新数据时旧数据点未被移除问题咨询
问题原因及修复方案
- 选择器使用错误
你当前使用svg.selectAll("myCircles")选择元素,这是选中标签名为myCircles的DOM元素,但你实际创建的是circle标签,并没有名为myCircles的自定义标签,导致每次执行选择时都拿到空集合,D3会判定所有新数据都需要新增,旧数据无法匹配到对应DOM元素,自然不会触发exit移除逻辑。 - 数据绑定的key函数逻辑错误
你在data()方法中传入的key函数返回的是完整的d对象,JS中对象的对比是引用对比,即使两个对象内容完全一致,只要引用地址不同就会被判定为不同数据,导致旧数据无法和已有DOM匹配,exit集合永远为空。 - 可选优化:你写的填充色值缺少
#前缀,"69b3a2"无法被浏览器识别为合法颜色,需要改成"#69b3a2"。
修复后的代码
function updateGeoData(ds, de) { console.log("hit 233") const size = d3.scaleLinear() .domain([1, 100]) // 数据值域 .range([4, 50]) // 像素映射范围 let updateData = $.get("/update_geo_data", {"ds":ds, "de":de}); updateData.done(function (result) { // 选择带指定类名的circle元素,保证能匹配到已创建的旧节点 var circles = svg.selectAll("circle.geo-bubble").data(result, function(d) { // 返回数据的唯一标识,这里用经纬度组合作为唯一键,可根据你的实际数据调整 return d.long + '-' + d.lat; }); circles.attr("class", "geo-bubble update"); circles.enter().append("circle") .attr("class", "geo-bubble") .merge(circles) .attr("cx", d => projection([d.long, d.lat])[0]) .attr("cy", d => projection([d.long, d.lat])[1]) .attr("r", d => size(d.count)) .style("fill", "#69b3a2") .attr("stroke", "#c99614") .attr("stroke-width", 2) .attr("fill-opacity", .4); // 移除和新数据不匹配的旧节点 circles.exit().remove(); }); }
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

