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

原文地址:https://www.cnblogs.com/lovellll/p/10208207.html

时间: 2024-11-09 07:41:54

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

jqery 动态添加元素 绑定事件

jQuery动态添加元素: var url = "...";//服务地址 $.ajax({ type: 'post', url: url, data:{fireId:fireId}, success: function(data){ for(var i = 0; i < data.data.length; i++){ var obj = data.data[i]; var temp = '<div class="div_stage"><spa

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

1.jQuery为动态添加的元素绑定事件:在1.7之后,添加了live()方法,1.9后又被移除,1.9中可用on()方法: [javascript] view plain copy $(function() { $('.btn').on('click', function() { alert('按钮被点击'); }); $('body').append('<button class="btn">动态添加的按钮</button>'); }); 2.获取check

用JS动态创建SVG元素并绑定事件

var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.setAttribute("width", "800"); svg.setAttribute("height", "500"); svg.addEventListener("load", function () {

jQuery动态添加元素无法触发绑定事件

用jquery动态添加元素后,发现给动态添加的元素无法触发事件.解决方案如下: 方法一:绑定live事件(live事件只在jquery1.9以下才支持,高版本不支持). 1 2 3 $(".newBtn").live("click",function(){ ///jquery 1.9(不包括1.9)以下可以                alert('这里是动态元素添加的事件');            }) 方法二:利用on()事件绑定 ($(ParentEle)

js动态添加元素之后jquery mobile不能正确渲染解决方法

jquerymobile动态添加元素之后有些不能被正确渲染的解决方法: listview: 添加 jq(".detail").listview("refresh"); div或其他:添加.trigger( "create" ); create事件适用范围广,甚至可以是 不存在的元素(raw markup?),比如要插入一个按钮 $('<a data-role="button">dy button</a>

jquerymobile动态添加元素之后

Jquerymobile动态添加元素之后有些不能被正确渲染的解决方法:listview:               添加 jq(".detail").listview("refresh");div或其他:         添加.trigger( "create" ); jq(".detail:eq("+ix+1+")").append("<li>"+data.linete[

AngularJs动态添加元素和删除元素

动态添加元素和删除元素 //通过$compile动态编译html var html="<div ng-click='test()'>我是后添加的</div>"; var template = angular.element(html); var mobileDialogElement = $compile(template)($scope); angular.element("#"+id).append(mobileDialogElement

【javascript】JQuery动态添加元素

JQuery动态添加元素方法 append() 在父级最后追加一个子元素  appendTo() 在父级最后追加一个子元素  prepend() 在父级最前面追加一个子元素  prependTo() 在父级最前面追加一个子元素   after() 在当前元素之后追加(是同级关系)  before() 在当前元素之前追加(是同级关系)  insertAfter() 将元素追加到指定对象的后面(是同级关系 insertBefore() 将元素追加到指定对象的前面(是同级关系)    appendCh

js 动态添加元素(div、li、img等)及设置属性

把一串 html 标签赋给一个 javascript 变量,除属性的值要用转义的双引号外,某些时候字符串还很长,显得有些复杂.如果用 js 动态添加元素,就不会有那么复杂的字符串出现,代码阅读性强一点,也容易理解. 网页是由 html 标签一层层组成的,js 也可以动态添加一层层的诸如 div.li.img 这样的标签.其实,不管是什么 html 标签,js 动态创建的方法都差不多,接着就先从动态添加 div 开始. 一.js 动态添加元素div <div id="parent"