【发布时间】:2017-10-13 14:33:26
【问题描述】:
代码在这里:Svg 实际上是由这些脚本在 div venn2 中创建的。
<div id="venn2"></div>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="js/venn.js"></script>
<script>
var sets = [
{sets:["A"], size: 12, label: "A"},
{sets:["B"], size:12, label: "B"},
{sets: ["A", "B"], size: 4, label: "AB"}
];
var chart = venn.VennDiagram()
.wrap(false)
.fontSize("14px")
.width(400)
.height(400);
function updateVenn(sets) {
var div = d3.select("#venn2").datum(sets);
var layout = chart(div),
textCentres = layout.textCentres;
div.selectAll(".label").style("fill", "white");
div.selectAll(".venn-circle path").style("fill-opacity", .6);
return layout;
}
</script>
我得到的脚本here 通过画布将 svg 转换为 png。
<canvas id="canvas" ></canvas>
<div id="png-container" ></div>
<script>
var svgString = new XMLSerializer().serializeToString(document.querySelector('svg'));
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var DOMURL = self.URL || self.webkitURL || self;
var img = new Image();
var svg = new Blob([svgString], {type: "image/svg+xml;charset=utf-8"});
var url = DOMURL.createObjectURL(svg);
img.onload = function() {
ctx.drawImage(img, 0, 0);
var png = canvas.toDataURL("image/png");
document.querySelector('#png-container').innerHTML = '<img src="'+png+'"/>';
DOMURL.revokeObjectURL(png);
};
img.src = url;
</script>
因此,作为 svg 的维恩图是由脚本 1 在 venn2 div 中创建的,然后 svg 由脚本 2 编写为 png。
对于每页一张 svg 图像,它工作得非常好。
当我在单个 html 页面上有多个这样的 svg venn 图时。只有第一个被转换为 png。
但我无法获取位置 2 和 3 或更多位置的 svg 以转换为 png。
我被这个代码卡住了
var svgString = new XMLSerializer().serializeToString(querySelectorAll('svg'));
其中“svg”仅表示我猜的第一个 svg,但不是以后。 我什至无法创建具有不同“id”的 svg,因为 svg 是由 d3 和 venn.js 脚本形成的。
问题是:如何转换 html 页面中的所有 svg 图像 当我不知道他们的 id 通过上面的代码来 png 图像时?
我不知道如何解析整个字符串var svgString以将所有字符串转换为不同的 png 图像?
【问题讨论】:
-
var svgString = new XMLSerializer().serializeToString(document.querySelector('svg'));只会找到第一个 SVG。 querySelectorAll 会找到它们。
-
@RobertLongson 我试过了,并尝试通过索引 0、1、2 等访问它们。但是 somwhow 没有用。或者可能是我做错了。
-
因为我看不到那个尝试,所以我无法评论你在那里可能做错了什么。
-
@RobertLongson 我实际上希望得到一个包含所有 3 个 svg 的大 png。甚至没有得到。
-
您需要遍历 querySelectorAll 返回的不同 SVG 对象。您不能将完整集传递给 XMLSerializer().serializeToString
标签: javascript jquery html d3.js svg