我正在使用D3在骨干视图中进行图形visuzalization。我允许用户捏合缩放图形,使用webkit转换平滑过渡,并在发布时重新绘制。为了简化代码,我只是重新绘制新图,而不是重新计算元素的新位置和大小(这是我的原始方法,但我的团队请求重绘路线)。DOM节点清理在d3中如何工作?
[我通过twitter与Bostock交谈。这实际上并不是首选的方式]
我注意到的事情是,对于每次重绘,我都会倾倒大量未清理的dom节点。
这与事件处理程序/闭包中的循环引用无关,因为我禁用了除标签之外的所有标签(这些标签没有附加处理程序),并且发生相同的行为。
我已经试图积极地从图中删除元素,但dom节点似乎仍然泄漏。
下面是一些相关的代码。 'render'被称为一组新的标签。在完成变焦,“关闭”叫上老图,一个新的与另一种观点认为实例创建,并调用“渲染”:
render: function() {
// create the svg offscreen/off dom
//document.createElementNS(d3.ns.prefix.svg, "svg")
var svg = this.svg = d3.select(this.el)
.append("svg:svg")
.attr('width', this.VIEW_WIDTH)
.attr('height', this.VIEW_HEIGHT)
this._drawTimeTicks.call(this, true);
return this;
},
_drawTimeTicks: function(includeLabels) {
var bounds = this.getDayBounds();
var min = bounds.start;
var date = new Date(min);
var hour = 1000 * 60 * 60;
var hourDiff = 60 * this.SCALE;
var graphX = (date.getTime() - min)/1000/60;
var textMargin = 7;
var textVert = 11;
// Using for loop to draw multiple vertical lines
// and time labels.
var timeTicks = d3.select(this.el).select('svg');
var width = timeTicks.attr('width');
var height = timeTicks.attr('height');
for (graphX; graphX < width; graphX += hourDiff) {
timeTicks.append("svg:line")
.attr("x1", graphX)
.attr("y1", 0)
.attr("x2", graphX)
.attr("y2", height)
.classed('timeTick');
if (includeLabels) {
timeTicks.append("svg:text")
.classed("timeLabel", true)
.text(this.formatDate(date))
.attr("x", graphX + textMargin)
.attr("y", textVert);
}
date.setTime(date.getTime() + hour);
}
close: function() {
console.log("### closing the header");
this.svg.selectAll('*').remove();
this.svg.remove();
this.svg = null;
this.el.innerHTML = '';
this.unbind();
this.remove();
}
正如你所看到的,我没有做任何事情棘手与事件处理程序或关闭。通过几次缩放交互,我可以泄漏几十个不会被GC回收的dom节点。
这是内存泄漏还是d3在幕后做一些事情来优化未来的图形构建/更新?有没有更好的方法来销毁我不知道的图形?
任何想法?
谢谢。我会研究不同的缩放选项,但之前我没有使用它们的原因是我的图形以矩形内的常量字体大小的文本为特征,并且我需要确定放大/缩小时所需的任何截断。但是,再次感谢所有帮助:) – Gopherkhan
是的,有几个原因,为什么几何变焦不足。有时你可以通过减小字体大小来增加缩放级别来修补这些问题,但通常以编程方式重新定位元素更为简单。 – mbostock
我知道这是一个老问题,但在这里查看一些关于DOM节点清理的特定于IE的注意事项:http://stackoverflow.com/questions/18575452/why-do-my-svg-nodes-leak-memory-in - 即 – explunit