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

SVG 快速入门


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);
});
});

SVG 动态添加元素与事件的更多相关文章

  1. jqery 动态添加元素 绑定事件

    jQuery动态添加元素: var url = "...";//服务地址 $.ajax({ type: 'post', url: url, data:{fireId:fireId} ...

  2. jQuery1.9为动态添加元素绑定事件以及获取和操作checkbox的选择属性

    1.jQuery为动态添加的元素绑定事件:在1.7之后,添加了live()方法,1.9后又被移除,1.9中可用on()方法: $(function() { $('.btn').on('click',  ...

  3. jquery html 动态添加元素绑定事件

    由于实际的需要,有时需要往网页中动态的插入HTML内容,并在插入的节点中绑定事件处理函数.我们知道,用Javascript向HTML文档中 插入内容,有两种方法, 一种是在写HTML代码写入JS,然后 ...

  4. js动态添加元素绑定事件问题

    //开始是直接普通写的绑定click事件 其中li a i 中的i是动态添加的 结果是触发不了..$("li a i").click(function () { $(this).m ...

  5. JS动态添加元素的事件动态绑定

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. jQuery动态添加元素事件

    在项目中遇到需要jQuery动态添加元素的事件,做了一个demo,方便以后遇到相同的问题可以用上: <!DOCTYPE html> <html> <head> &l ...

  7. jquery动态添加元素无法触发绑定事件的解决方案。

    jquery动态添加元素无法触发绑定的事件的解决方案. ╭(●`∀´●)╯二狗最近在工作中遇到一个问题,即当用jquery动态添加元素后,发现给动态添加的元素却无法触发事件(╯#-_-)╯╧═╧ ( ...

  8. jquerymobile动态添加元素之后不能正确渲染解决方法

    jquerymobile动态添加元素之后有些不能被正确渲染的解决方法: listview:               添加 jq(".detail").listview(&quo ...

  9. angular.element方法汇总以及AngularJS 动态添加元素和删除元素

    addClass()-为每个匹配的元素添加指定的样式类名after()-在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点append()-在每个匹配元素里面的末尾处插入参数内容att ...

随机推荐

  1. 【玲珑杯 round#18 A】计算几何你瞎暴力

    [Link]:http://www.ifrog.cc/acm/problem/1143?contest=1020&no=0 [Description] [Solution] 因为每个点的(xi ...

  2. centos7的变化(转)

    centos7的变化 找了一个下午都不知道为什么找不到一些命令,终于在一个地方看到了. 地址:http://www.sa-log.com/276.html 王, 帅 2015年09月24日 于 运维日 ...

  3. Window和Mac下端口占用情况及处理方式

    1. 在Mac下端口占用的情况: 找到占用的进程并杀掉: 1.查看端口占用进程 sudo lsof -i :8880 可以看到进程的PID 2.杀掉进程 sudo kill -9 4580(4580为 ...

  4. 一起使用Python里for循环和dictionary字典

    1.先定义一个字典的内容 i= { 'status': 'success', 'country': '中国', 'countryCode': 'CN', 'region': 'BJ' } 2.打印字典 ...

  5. badboy的录制和jmeter的使用

    v  Jmeter是什么 Apache Jmeter是Apache组织开发的基于Java的压力测试工具. Jmeter可以用于对服务器.网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析 ...

  6. 【心无旁骛】vuex-typescript-example

    我不惮以最大的赞美去赞美这样的项目,真的是非常有创意又有能力. 先放上我喜欢的这个项目的开源地址:https://github.com/gluons/vuex-typescript-example 我 ...

  7. leyou_01_自定义异常处理器

    1.自定义异常处理器,当程序发生异常时可以我们可以自己定义返回的,状态码和状态信息 2.当异常发生时调用我们的自定义异常 @RestController @RequestMapping("i ...

  8. 深入浅出 Java Concurrency (5): 原子操作 part 4[转]

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度 ...

  9. linux学习(一)-----vm、centos安装

    安装vm和Centos 1)先安装 virtual machine ,vm12 2)再安装 Linux (CentOS 6.8) 3)原理示意图,这里我们画图说明一下 VM 和 CentOS 的关系. ...

  10. PipeCAD之管道标准库PipeStd(3)

    PipeCAD之管道标准库PipeStd(3) Key Words: PipeCAD, PipeStd, Pipe Design 3D, Linux 1. Introduction    管道标准部件 ...