Вставить строку SVG в дом? - PullRequest
5 голосов
/ 15 июня 2010

У меня есть переменная javascript, которая в основном выглядит так:

my_svg_image = '<circle cx="227.58331298828125" cy="102" r="3" style="fill:black;stroke-width:0" />';

Он был загружен из моей базы данных. Есть ли способ, которым я могу проанализировать эту строку и добавить ее в DOM с помощью Javascript? Я настроил svgweb, но не вижу, как я могу получить его для анализа этой строки. Есть ли другие библиотеки, которые могут помочь?

Ответы [ 2 ]

3 голосов
/ 16 июня 2010

вы пробовали свойство javascript innerHTML ?

edit: Вы можете использовать свойство innerHTML только для html-элементов, поэтому вы можете использовать строку, содержащую целое изображение svg, чтобы добавить его в html-элемент. Но вы не можете добавить элемент svg к существующему элементу svg.

Пример:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg">
   <head>
      <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8"/>
   <script type="text/javascript">
   <![CDATA[    
    function test() {
        var newsvg = document.getElementById("svg-wrapper");
        var svgstr = '<svg:svg height="300" width="700" id="svg-container"><svg:circle cx="150px" cy="100px" r="30px" /></svg:svg>';
        newsvg.innerHTML = svgstr;
    }   
   ]]>
   </script>
   <title>SVG DOM</title>
 </head>
 <body>
    <div id="svg-wrapper"></div>
    <input type="button" onclick="javascript:test();" value="generate svg"/><br/>
 </body>
 </html>

Если вы хотите добавить круг к существующему встроенному SVG, вы должны добавить его, используя методы DOM (и, вероятно, сначала проанализируйте вашу строку, чтобы извлечь необходимые значения атрибута).

1 голос
/ 27 сентября 2014

Недавно я искал что-то похожее на это, но мне нужно было обновить часть существующего SVG, поэтому использование innerHTML для меня не вариант. В итоге я взглянул на то, как Canvg справился с этим, и придумал:

var $contentToReplace = $('svg .some-class');
$contentToReplace.empty();

var content = new DOMParser().parseFromString(newContent, 'text/xml');

// content.children is an HTMLCollection, so using Array.prototype.slice to make a copy. if you
// don't make a copy, items will be removed from content.children each time appendChild is called,
// which will mess up the loop iteration
var children = Array.prototype.slice.call(content.children);
for (var i = 0; i < children.length; i++) {
  $contentToReplace.get(0).appendChild(children[i]);
}

Вы можете проверить, как они это сделали в Canvg - просто найдите метод parseXml.

Вы также можете передать различные MIME-типы методу parseFromString. Однако поддержка браузеров в них немного различается - например, MIME-тип image / svg + xml не поддерживается в IE9 и более ранних версиях.

Изменение типа MIME просто меняет тип документа, который вы получите обратно. Использование text / xml возвращает XMLDocument, который в данном случае работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...