我需要下载我创建的D3创建的SVG图表。我找到了this question的一个答案,建议将SVG编码为base64,但后来我发现this post表示纯文本也应该没问题,所以我提出了类似的结果:< / p>
<!DOCTYPE html>
<html>
<head>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
<script>
var data = [22, 33, 11, 55, 44];
var svg = d3.select('body').append('svg')
.attr('id', 'chart')
.attr('version', '1.1')
.attr('xmlns', 'http://www.w3.org/2000/svg')
.attr('width', 600)
.attr('height', 400)
.style('background-color', 'powderblue')
.selectAll('circle')
.data(data)
.enter().append('circle')
.attr('cx', function(d) { return 8*d; })
.attr('cy', function(d) { return 4*d; })
.attr('r', function(d) { return d; })
.style('fill', function(d) { return d3.rgb(2*d, 4*d, 3*d); })
;
d3.select('body').append('a')
.attr('href-lang', 'image/svg+xml')
.attr('href', 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg">' + unescape(svg.node().parentNode.innerHTML) + '</svg>')
.text('Download')
;
</script>
</body>
</html>
上面的代码部分工作,因为下载链接可以在浏览器中打开或下载到文件中,但在每种情况下只有圆圈是可见的,而其他所有(即宽度,高度,bg颜色)都会丢失,因此SVG只能在原始HTML页面中正确显示。 获取使用D3创建的SVG完整代码的正确方法是什么?我尝试过svg.html()和d3.select(svg).html(),但它返回null。
答案 0 :(得分:4)
您可以尝试保存父{c} outerHTML
.attr('href', 'data:image/svg+xml;utf8,' + unescape(svg.node().parentNode.outerHTML))
<!DOCTYPE html>
<html>
<head>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
<script>
var data = [22, 33, 11, 55, 44];
var svg = d3.select('body').append('svg')
.attr('id', 'chart')
.attr('version', '1.1')
.attr('xmlns', 'http://www.w3.org/2000/svg')
.attr('width', 600)
.attr('height', 400)
.style('background-color', 'powderblue')
.selectAll('circle')
.data(data)
.enter().append('circle')
.attr('cx', function(d) { return 8*d; })
.attr('cy', function(d) { return 4*d; })
.attr('r', function(d) { return d; })
.style('fill', function(d) { return d3.rgb(2*d, 4*d, 3*d); })
;
d3.select('body').append('a')
.attr('href-lang', 'image/svg+xml')
.attr('href', 'data:image/svg+xml; charset=utf8, ' + unescape(svg.node().parentNode.outerHTML))
.text('Download')
;
</script>
</body>
</html>
&#13;
Ps :您可能还想在链接上添加download
属性,对于最近的浏览器,用户可以直接将其作为文件下载。
PPs :要强制新文件的宽度高度,您应该设置svg的viewbox
属性
PPP:要拥有一个完全有效的svg文件(即设置了DOCTYPE等),我认为你必须再添加这四行:
var svgDocType = document.implementation.createDocumentType('svg', "-//W3C//DTD SVG 1.1//EN", "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd");
var svgDoc= document.implementation.createDocument ('http://www.w3.org/2000/svg', 'svg', svgDocType);
svgDoc.replaceChild(svg.node().parentNode.cloneNode(true), svgDoc.documentElement);
svgData = (new XMLSerializer()).serializeToString(svgDoc);
var data = [22, 33, 11, 55, 44];
var svg = d3.select('body').append('svg')
.attr('id', 'chart')
.attr('version', '1.1')
.attr('xmlns', 'http://www.w3.org/2000/svg')
.attr('width', 600)
.attr('height', 400)
.style('background-color', 'powderblue')
.selectAll('circle')
.data(data)
.enter().append('circle')
.attr('cx', function(d) { return 8*d; })
.attr('cy', function(d) { return 4*d; })
.attr('r', function(d) { return d; })
.style('fill', function(d) { return d3.rgb(2*d, 4*d, 3*d); })
;
var svgDocType = document.implementation.createDocumentType('svg', "-//W3C//DTD SVG 1.1//EN", "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd");
var svgDoc= document.implementation.createDocument ('http://www.w3.org/2000/svg', 'svg', svgDocType);
svgDoc.replaceChild(svg.node().parentNode.cloneNode(true), svgDoc.documentElement);
svgData = (new XMLSerializer()).serializeToString(svgDoc);
d3.select('body').append('a')
.attr('href-lang', 'image/svg+xml')
.attr('href', 'data:image/svg+xml; charset=utf8, ' + encodeURIComponent(svgData))
.text('Download')
;
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
&#13;