SVG文件是由各个元素组成。元素由标签定义,而标签格式即html的元素定义格式。但是载入一个SVG文件,却无法通过常规的js获取对象方式来获取到SVG中定义的元素,更无法通过这种方式来动态添加SVG元素与事件。

SVG元素的操作都要借助于SVG的document对象。SVG的document对象获取方式为:

svgDoc = document.getElementById("mySVG").getSVGDocument();
mySVG 为SVG主体的id。注意需要在SVG完全加载完成后才可获取,否则获取到的是null。

然后调用 svgDoc . createElementNS()函数即可创建SVG元素,为创建的元素进行属性设置,并绑定事件监听器。最后调用 svgDoc.rootElement.appendChild() 函数来将创建的元素添加给 svgDoc

示例代码:

<embed id="mySVG" src="map.svg" type="image/svg+xml" />
<div>x坐标值<input id="xValue"></div>
<div>y坐标值<input id="yValue"></div>
<div>文本内容<input id="iText"></div>
<button id="add">动态添加元素</button>
<script>
	var svgDoc = null;
	var time = null;
	// 动态添加元素
	var addElement = function(x, y, nodeText) {
		// 添加圆形
		var c = svgDoc.createElementNS('http://www.w3.org/2000/svg', 'circle');
		c.setAttribute('cx', x);
		c.setAttribute('cy', y);
		c.r.baseVal.value = 7;
		c.setAttribute('fill', 'red');
		c.addEventListener("click", function() {
			alert('圆形点击测试:' + nodeText);
		c.addEventListener("mouseover", function() {
			console.log('圆形鼠标悬停测试:' + nodeText);
		svgDoc.rootElement.appendChild(c);
		// 添加文本
		var t = svgDoc.createElementNS('http://www.w3.org/2000/svg', 'text');
		t.setAttribute("x", parseInt(x) + 5);
		t.setAttribute("y", parseInt(y) + 10);
		t.setAttribute("font-size", "20");
		t.setAttribute('fill', 'green');
		t.addEventListener("click", function() {
			alert('文本点击测试:' + nodeText);
		t.addEventListener("mouseover", function() {
			console.log('文本鼠标悬停测试:' + nodeText);
		t.innerHTML = nodeText;
		svgDoc.rootElement.appendChild(t);
	// 载入SVG
	var loadSvg = function() {
		svgDoc = document.getElementById("mySVG").getSVGDocument();
		if(svgDoc == null) {
			time = setTimeout("loadSvg()", 300);
		} else {
			clearTimeout(time);
			loadCallback();
	// 载入回调
	var loadCallback = function() {
		console.log("加载完成");
	$(function() {
		// 延迟加载
		setTimeout("loadSvg()", 300);
		// 按钮
		$("#add").click(function() {
			var nodeText = $("#iText").val();
			if(nodeText == "") {
				nodeText = "未输入文本";
			console.log(nodeText);
			addElement($("#xValue").val(), $("#yValue").val(), nodeText);
</script>
                                    在使用 SVG 时,需要使用 appendChild 来添加元素。但是如下的写法是不生效的:
let newElement = document.createElement('rect');
newElement.setAttribute('fill','orange');
newElement.setAttribute('width','200');
newElement.setAttribute('height','200');
document.getElementById('svg-drawing
简短的文档
首先看一下在页面中添加脚本的'index.html'文件的源代码。
 发起群组: var group = new r.group('container',array); 其中:'r' 是 Raphael JS 画布,'container' 是 HTML 元素 ID,其中使用 Raphael JS 创建 SVG,'array' 是 Raphael JS 对象的数组可用方法
group.rotate
group.getAttr
group.clipPath
 group.animate
 在 MIT 许可下获得许可
                                    前边了解到可以使用IText生成PDF文件,但是IText本身不直接支持插入SVG,所以我们要进行一次格式准换,现将SVG文件转换成Image,然后插入Image,达到插入SVG的效果。
  将SVG转换成Image我使用的是batik
  官网:https://xmlgraphics.apache.org/batik/
  Maven包:https://mvnrepos...
                                    maven pom.xml1.82.0.15.5.8org.apache.xmlgraphicsxmlgraphics-commons${xmlgraphics.version}org.apache.xmlgraphicsbatik-svggen${batik.version}org.apache.xmlgraphicsbatik-xml${batik.version}org.apache.xml...
                                    SVG文件是由各个元素组成。元素由标签定义,而标签格式即html的元素定义格式。但是载入一个SVG文件,却无法通过常规的js获取对象方式来获取到SVG中定义的元素,更无法通过这种方式来动态添加SVG元素与事件SVG元素的操作都要借助于SVG的document对象。SVG的document对象获取方式为:
SVG 快速入门
svgDoc = document.getElementById("...
                                    svgcanvas
 我创建此存储库是因为我的需要一个模拟<canvas>元素。 这个库主要基于gliffy的出色工作:  。
 如果您想要的是干净简单的canvas上下文API,则应使用 。
 主要区别在于:此库还为元素添加了一些模拟API(例如宽度,高度,样式,className,getBoundingClientRect,toDataURL)。
 请注意,此库还添加了一些脏API(例如调试的上下文API调用历史记录,gc一些不可见的元素)。 这些API太脏了,因此我没有提出对这些API的请求。 但是,它们对于我的很有用和必要,因此我将它们保留在我的lib中。
var svgcanvas = new SVGCanvas ( ) ;
svgcanvas . width = 100 ;
var height = svgcanvas . height ;
var ctx = svgca
 这个简单的页面加载一个 SVG 并将其显示在画布上。 每个对象都是可编辑/可拖动的。 作为参考,它还包含 SVG 如何在 IE 中显示的图像。
换行符不渲染到 FabricJS 画布
在第一次鼠标按下/交互之前,文本不会以正确的字体显示
当使用 SVG 文本的左侧/顶部位置创建 IText 时,文本位于屏幕外
                                    大致的流程是这样的:实现这个需求是首先通过一个工具(drawio)去自定义绘制图形,然后导出一个svg格式的文件,后端搞了一下drawio工具的源码,在导出的时候,为绘制的图形上每个节点都去绑定了一个id(具体是怎么搞得我一个前端也不是太清楚),最后导出,然后前端需要去加载svg,然后每个节点都会有对应的数据(就是根据绑定的id去获取),然后有些节点上还可能有图片,还需要替换,还可能为每个节点去绑定事件做一些事情。然后还使用了d3实现了让svg可以缩放拖拽。大概是这个亚子
先上一张自己测试用的svg