d3在数据更新时错误地附加了dom元素
d3 wrongly append dom elements on data update
我正在尝试使用d3和他的进入/退出模式来更新我的条形图在这里你可以看到当前的结果http://jsfiddle.net/k8sftbez/
这个想法是,我应该为每个数据对象属性都有一个带有rect和文本的元素,比如:
<g>
<rect></rect>
<text></text>
</g>
该图创建为aspected,但我的问题是,当我尝试更新条形图颜色时(我在mouseover上进行),它没有更新当前的rect和text标记,而是在每次更新时添加2个新标记。在这个例子中你可以看到问题(http://jsfiddle.net/k8sftbez/)
这是因为您的更新函数实际上也包括条形的创建,为了让它们只更改颜色,您应该有两个单独的函数,一个用于对象的附加,另一个用于更新(例如,您可以有一个附加没有任何属性的矩形的函数和对它们进行样式设置的更新函数)
最后,我修复了如下修改更新函数的问题:http://jsfiddle.net/5ft6uL6k/
我认为是更优雅的方式,使用占位符并更新它们。
基本上这部分:
var bar = chart.selectAll("g").data(data)
bar.enter().append("g").attr("transform", function(d, i) {
return "translate(0," + i * barHeight + ")";
})
var valueBar = bar.append("rect");
valueBar
.attr(valueBarValues.attr)
.attr("width", function(d){return x(d.value)})
.style(valueBarValues.style);
bar.append("text")
.attr(textConfig.attrs)
.style(textConfig.style)
.text(function(d) { return d.name; })
bar.exit().remove();
更改如下:
var bar = chart.selectAll("g").data(data)
var barEnter = bar.enter().append("g");
barEnter.attr("transform", function(d, i) {
return "translate(0," + i * barHeight + ")";
});
barEnter.append("rect");
barEnter.append("text");
var textBar = bar.selectAll("text")
textBar
.attr(textConfig.attrs)
.style(textConfig.style)
.text(function(d) { return d.name; })
var valueBar = bar.selectAll("rect");
valueBar
.attr(valueBarValues.attr)
.attr("width", function(d){return x(d.value)})
.style(valueBarValues.style);
bar.exit().remove();
相关文章:
- 如何在DOM元素上按类型构建此函数
- DOM元素和angular元素之间的主要区别是什么
- 当带有渲染器的DOM元素不在屏幕顶部时,移动了场景的坐标
- 使用jquery创建dom元素会导致ie9出现拒绝访问错误
- 如何在使用Ractive.extend()时引用DOM元素
- 在d3中向DOM元素添加了图像,但现在它赢得了't过渡
- 如何'剪切'DOM元素并将其显示在其他位置
- 转换<a>使用jQuery将文本字符串转换为dom元素
- d3在数据更新时错误地附加了dom元素
- 访问VueJS中的DOM元素
- 在Meteor中如何查找DOM元素(渲染后)
- IE9-添加和删除DOM元素会破坏父keydown事件
- 未捕获错误:元素缓存中id为x的DOM元素与DOM中的元素不同
- 在 ng-if 编译后访问指令中的 DOM 元素
- spin.js/angular spinner:如何将spin定位到DOM元素中(包括plunker演示)
- 如何在dom元素中插入输入标记数据插件
- Mobile Safari、jQuery以及绑定到未来的DOM元素
- 从字符串创建dom元素时添加多个类
- 如何根据客户端的屏幕大小使用javascript更改DOM元素
- 为onClick-hander插入临时DOM元素