Javascript exit().remove()不';t在d3.js中更新之前删除旧图表
我有一个使用Javascript exit().remove()不';t在d3.js中更新之前删除旧图表,javascript,jquery,svg,d3.js,charts,Javascript,Jquery,Svg,D3.js,Charts,我有一个使用在同一页面上创建多个图表的代码。每个函数都与第一个svg一起使用 var svg = svg1.enter().append("svg:svg") svg.attr("class", "r_chart") .attr("width", left_width + width) .attr("height", height) .attr('viewBox', '0 0 350 310') .attr('perserveAspectRatio'
在同一页面上创建多个图表的代码。每个函数都与第一个svg一起使用
var svg = svg1.enter().append("svg:svg")
svg.attr("class", "r_chart")
.attr("width", left_width + width)
.attr("height", height)
.attr('viewBox', '0 0 350 310')
.attr('perserveAspectRatio', 'xMinYMid')
.each(function(d,no){
var base = d3.select(this);
base.selectAll("g").data(d.values);
....
})
有人能指出为什么在使用jQuerychange
函数更新select之前没有从DOM中删除旧图表吗?我有svg1.exit().remove()代码>在函数末尾:
`svg1.exit().remove();`
下面是页面加载时显示的JSON数据
[{"name":"A","tid":"54","image":"img","measure":32,"group":"53"},
{"name":"B","tid":"55","image":"img","measure":45,"group":"53"},
{"name":"R","tid":"59","image":"img","measure":40,"group":"23"},
{"name":"T","tid":"29","image":"img","measure":20,"group":"23"}]
以及更新
[{"name":"G","tid":"14","image":"img","measure":78,"group":"53"},
{"name":"S","tid":"85","image":"img","measure":25,"group":"55"},
{"name":"U","tid":"44","image":"img","measure":78,"group":"53"},
{"name":"K","tid":"29","image":"img","measure":32.6,"group":"55"},
{"name":"Y","tid":"53","image":"img","measure":30,"group":"24"},
{"name":"O","tid":"26","image":"img","measure":25,"group":"24"}]
完整代码:
var width = 350,
height = 310,
barHeight = 80,
left_width = 80,
fo_height = 70;
var x = d3.scale.linear().range([0, width / 1.5]);
y = d3.scale.ordinal().rangeBands([0, height]);
function chart(array){
array = JSON.parse(array);
console.log(array);
var colors = ['#222','red','blue'];
var nested_data = d3.nest().key(function(d) { return d.group; }).entries(array);
ymax = d3.max(nested_data,function(d){
return d.values.map(function(t){
return t.measure;
})
});
nested_data.forEach(function(nd){
nd.values.forEach(function(d){
d.measure = +d.measure;
})
})
var diff = 2;
var tickno = 5
var ymax = d3.max(nested_data, function(nd,k) {
return d3.max(nd.values,function(p,l){
return p.measure ;
});
});
var ymin = d3.min(nested_data, function(nd,k) {
return d3.min(nd.values,function(p,l){
return p.measure - 2;
});
});
x.domain([ymin ,ymax]);
console.log(nested_data);
var svg1 = d3.select('.chart').selectAll("svg").data(nested_data)
var svg = svg1.enter().append("svg:svg")
svg.attr("class", "r_chart")
.attr("width", left_width + width)
.attr("height", height)
.attr('viewBox', '0 0 350 310')
.attr('perserveAspectRatio', 'xMinYMid')
.each(function(d,no){
var count = 1;
var base = d3.select(this);
var bar1 = base.selectAll("g").data(d.values);
var bar = bar1.enter().append("g")
.attr("transform", function(t, i) {
return "translate("+left_width * count+"," + (i+0.5) * barHeight + ")";
count++;
});
var rule1 = base.selectAll(".rule")
.data(x.ticks(5));
var rule = rule1.enter().append("text");
rule.attr("class", "rule changeprice")
.attr("x", function(d) { return x(d) + left_width ; })
.attr("y", barHeight /2)
.attr("dy", -6)
.attr("text-anchor", "middle")
.attr("font-size", 10)
.text(String);
var rect = bar.append("rect")
.style("fill", function(v,l) {
return colors[l]
})
.attr("width", 0)
.attr("height", barHeight - 20)
.attr("rx", 2)
.attr("width", function(t){
return x(t.measure) + 'px';
})
bar.append("text")
.attr("dx", - left_width)
.attr("dy", fo_height )
.style("font-size",'10px')
.text(function(t) { return t.name; })
}) // each fucntion
svg1.exit().remove();
}
var array = $('#a2').text();
chart(array);
$('select').on('change',function(){
var get = $(this).val();
var data = $('#a'+get).text();
chart(data)
});
给你:
请告诉我这是否是你需要的。我改变了创建svg1变量的方法。在改变之后立即删除项目通常会更好。我也有exit().remove()的问题,过了很长时间才发现。这不是d3应该使用的方式,但它工作得很好
css:
.data{display:none}
html:
<select><option>Select</option><option value='1'>1</option><option value='2'>2</option></select>
<div class="chart"></div>
<div id='a2' class="data">[{"name":"A","tid":"54","image":"img","measure":32,"group":"53"},{"name":"B","tid":"55","image":"img","measure":45,"group":"53"},{"name":"R","tid":"59","image":"img","measure":40,"group":"23"},{"name":"T","tid":"29","image":"img","measure":20,"group":"23"}]</div>
<div id='a1' class='data'>[{"name":"G","tid":"14","image":"img","measure":78,"group":"53"},{"name":"S","tid":"85","image":"img","measure":25,"group":"55"},
{"name":"U","tid":"44","image":"img","measure":78,"group":"53"}, {"name":"K","tid":"29","image":"img","measure":32.6,"group":"55"}, {"name":"Y","tid":"53","image":"img","measure":30,"group":"24"},{"name":"O","tid":"26","image":"img","measure":25,"group":"24"}]</div>
js:
var width = 350,
height = 310,
barHeight = 80,
left_width = 80,
fo_height = 70;
var x = d3.scale.linear().range([0, width / 1.5]);
y = d3.scale.ordinal().rangeBands([0, height]);
function chart(array){
array = JSON.parse(array);
console.log(array);
var colors = ['#222','red','blue'];
var nested_data = d3.nest().key(function(d) { return d.group; }).entries(array);
ymax = d3.max(nested_data,function(d){
return d.values.map(function(t){
return t.measure;
})
});
nested_data.forEach(function(nd){
nd.values.forEach(function(d){
d.measure = +d.measure;
})
})
var diff = 2;
var tickno = 5
var ymax = d3.max(nested_data, function(nd,k) {
return d3.max(nd.values,function(p,l){
return p.measure ;
});
});
var ymin = d3.min(nested_data, function(nd,k) {
return d3.min(nd.values,function(p,l){
return p.measure - 2;
});
});
x.domain([ymin ,ymax]);
console.log(nested_data);
svg1 = d3.select('.chart').selectAll("svg").data(nested_data)
var svg = svg1.enter().append("svg:svg")
svg.attr("class", "r_chart")
.attr("width", left_width + width)
.attr("height", height)
.attr('viewBox', '0 0 350 310')
.attr('perserveAspectRatio', 'xMinYMid')
.each(function(d,no){
var count = 1;
var base = d3.select(this);
var bar1 = base.selectAll("g").data(d.values);
var bar = bar1.enter().append("g")
.attr("transform", function(t, i) {
return "translate("+left_width * count+"," + (i+0.5) * barHeight + ")";
count++;
});
var rule1 = base.selectAll(".rule")
.data(x.ticks(5));
var rule = rule1.enter().append("text");
rule.attr("class", "rule changeprice")
.attr("x", function(d) { return x(d) + left_width ; })
.attr("y", barHeight /2)
.attr("dy", -6)
.attr("text-anchor", "middle")
.attr("font-size", 10)
.text(String);
var rect = bar.append("rect")
.style("fill", function(v,l) {
return colors[l]
})
.attr("width", 0)
.attr("height", barHeight - 20)
.attr("rx", 2)
.attr("width", function(t){
return x(t.measure) + 'px';
})
bar.append("text")
.attr("dx", - left_width)
.attr("dy", fo_height )
.style("font-size",'10px')
.text(function(t) { return t.name; })
}) // each fucntion
}
var array = $('#a2').text();
var svg1;
chart(array);
$('select').on('change',function(){
var get = $(this).val();
var data = $('#a'+get).text();
svg1.remove();
chart(data)
});
css:
.data{显示:无}
html:
选择12
[{“名称”:“A”,“tid”:“54”,“图像”:“img”,“度量”:32,“组”:“53”},{“名称”:“B”,“tid”:“55”,“图像”:“img”,“度量”:45,“组”:“53”},{“名称”:“R”,“tid”:“59”,“图像”:“img”,“度量”:40,“组”:“23”},{“名称”:“T”,“tid”:“29”,“图像”:“img”,“度量”:20,“组”:“23”}]
[{“名称”:“G”,“tid”:“14”,“图像”:“img”,“度量值”:78,“组”:“53”},{“名称”:“S”,“tid”:“85”,“图像”:“img”,“度量值”:25,“组”:“55”},
{“名称”:“U”,“tid”:“44”,“图像”:“img”,“度量值”:78,“组”:“53”},{“名称”:“K”,“tid”:“29”,“图像”:“img”,“度量值”:32.6,“组”:“55”},{“名称”:“Y”,“tid”:“53”,“图像”:“img”,“度量值”:30,“组”:“24”},{“名称”:“O”,“tid”:“26”,“图像”:“img”,“度量值”:25,“组”:“24”}]
js:
可变宽度=350,
高度=310,
杆高=80,
左_宽度=80,
fo_高度=70;
var x=d3.刻度.线性().范围([0,宽度/1.5]);
y=d3.scale.ordinal().范围带([0,高度]);
功能图(数组){
array=JSON.parse(array);
console.log(数组);
变量颜色=['#222','红色','蓝色';
var nested_data=d3.nest().key(函数(d){return d.group;}).entries(数组);
ymax=d3.max(嵌套_数据,函数(d){
返回d.values.map(函数(t){
返回t.measure;
})
});
嵌套的\u data.forEach(函数(nd){
forEach(函数(d){
d、 measure=+d.measure;
})
})
var-diff=2;
var tickno=5
var ymax=d3.max(嵌套的_数据,函数(nd,k){
返回d3最大值(nd值,函数(p,l){
返回p.measure;
});
});
var ymin=d3.min(嵌套的_数据,函数(nd,k){
返回d3.min(第二个值,函数(p,l){
返回p.measure-2;
});
});
x、 域([ymin,ymax]);
console.log(嵌套的_数据);
svg1=d3。选择('.chart')。选择全部(“svg”)。数据(嵌套的_数据)
var svg=svg1.enter().append(“svg:svg”)
attr(“类”、“r_图”)
.attr(“宽度”,左\宽度+宽度)
.attr(“高度”,高度)
.attr('viewBox','0 0 350 310')
.attr('perserveAspectRatio','xMinYMid')
.每个(功能(d,否){
var计数=1;
var base=d3。选择(此项);
var bar1=基本。选择全部(“g”)。数据(d.值);
var bar=bar1.enter().append(“g”)
.attr(“变换”,函数(t,i){
返回“translate(“+left_width*count+”,“+(i+0.5)*barHeight+”);
计数++;
});
var rule1=base.selectAll(“.rule”)
.数据(x.5);
var rule=rule1.enter().append(“文本”);
rule.attr(“类”,“规则变更价格”)
.attr(“x”,函数(d){return x(d)+left_width;})
.attr(“y”,酒吧高度/2)
.attr(“dy”,-6)
.attr(“文本锚定”、“中间”)
.attr(“字体大小”,10)
.文本(字符串);
var rect=bar.append(“rect”)
.样式(“填充”,功能(v,l){
返回颜色[l]
})
.attr(“宽度”,0)
.attr(“高度”,酒吧高度-20)
.attr(“rx”,2)
.attr(“宽度”,函数(t){
返回x(t.measure)+‘px’;
})
附加条(“文本”)
.attr(“dx”,-左侧宽度)
.attr(“dy”,fo_高度)
.style(“字体大小”,“10px”)
.text(函数(t){返回t.name;})
})//每个功能
}
var数组=$('#a2').text();
var-svg1;
图表(数组);
$('select')。在('change',function()上{
var get=$(this.val();
var data=$('#a'+get).text();
svg1.remove();
图表(数据)
});