SVG动态添加元素与事件

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>


  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在SVG图上添加局部点击事件,您需要使用JavaScript。以下是一个简单的例子: 1. 首先,在SVG代码中为要添加点击事件的元素添加一个唯一的ID。例如,假设您的SVG代码如下: ```html <svg width="100" height="100"> <circle id="myCircle" cx="50" cy="50" r="40" fill="red" /> </svg> ``` 在上面的代码中,我们为圆形元素添加了一个ID“myCircle”。 2. 接下来,您需要使用JavaScript为该元素添加一个点击事件。例如,下面是一个使用原生JavaScript添加点击事件的例子: ```javascript // 获取SVG元素 var svg = document.querySelector('svg'); // 获取要添加点击事件的元素 var myCircle = document.querySelector('#myCircle'); // 添加点击事件 myCircle.addEventListener('click', function() { alert('您点击了圆形!'); }); ``` 在上面的代码中,我们首先获取了SVG元素,然后获取了要添加点击事件的圆形元素。接下来,我们为该元素添加了一个点击事件,当用户点击圆形时,将弹出一个警告框。 3. 最后,您需要将JavaScript代码嵌入到HTML文件中。例如,下面是完整的HTML代码示例: ```html <!DOCTYPE html> <html> <head> <title>SVG点击事件示例</title> </head> <body> <svg width="100" height="100"> <circle id="myCircle" cx="50" cy="50" r="40" fill="red" /> </svg> <script> // 获取SVG元素 var svg = document.querySelector('svg'); // 获取要添加点击事件的元素 var myCircle = document.querySelector('#myCircle'); // 添加点击事件 myCircle.addEventListener('click', function() { alert('您点击了圆形!'); }); </script> </body> </html> ``` 在上面的代码中,我们将JavaScript代码嵌入到HTML文件的`<script>`标签中。当用户点击圆形时,将弹出一个警告框。 请注意,上面的示例仅适用于单个元素。如果您需要在SVG图中添加多个局部点击事件,您需要为每个元素重复上述步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值