簡體   English   中英

動態將元素添加到已加載的svg文件

[英]Dynamically adding elements to loaded svg file

從InkScape加載svg文件后,我想在程序控制下創建的圖形中添加新元素。 如果僅更改已經存在的元素的屬性,這似乎很好用,但是即使在檢查DOM時出現了新創建的元素,也不會顯示它們!

手工簡化的SVG測試文件:

<svg id="svg8" width="1e3" height="750" version="1.1" 
 viewBox="0 0 264.58333 198.43751" xmlns="http://www.w3.org/2000/svg">

    <g id="layer"><circle id="cc0" cx="20" cy="20" r="10"/></g>

</svg>

javascript / html文件:

<!doctype html><html><head><meta charset="UTF-8"/>

<script>
    function addCircle() {
        var svgDoc = document.getElementById("test");
        var svg = svgDoc.contentDocument;
        var svgns = svgDoc.namespaceURI;

        // Ok, this changes the circle to red
        var c0 = svg.getElementById("cc0");
        c0.setAttribute("fill", "#ff0000");

        var layer = svg.getElementById("layer");

        // Create a circle inside layer "g"
        var cc = document.createElementNS(svgns, "circle");
        cc.setAttribute("cx", "50");
        cc.setAttribute("cy", "50");
        cc.setAttribute("r", "20");

        layer.appendChild(cc);
        // However it's not updating the screen
        // even if DOM shows the circle is there, inside the "g"
    }
</script></head>

<body>
<object id="test" data="test.svg" type="image/svg+xml"></object>
<script>    
    document.onreadystatechange = function(){
       if(document.readyState === 'complete') addCircle(); }
</script>
</body>
</html>

我究竟做錯了什么? 還是我想念什么? 謝謝!

它是創建圈子所傳遞的svg命名空間的問題。 嘗試這個

var cc = document.createElementNS("http://www.w3.org/2000/svg", "circle");

您正在獲取<object>元素的namespaceURI
您需要的是內部文檔的documentElement之一:

function addCircle() {
  // this is the <object>
  var svgDoc = document.getElementById("test");
  var svg = svgDoc.contentDocument;
  // here get the real svg document
  var svgns = svg.documentElement.namespaceURI;
  //...

作為一個笨拙的人,因為stacksnippets®不允許修改內部框架...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM