2013-11-27 4 views
3

У меня есть графический объект, который я хотел бы загрузить в качестве фона для моей визуализации d3 (или просто как svg, что я могу добавить circle элементов). Иллюстрация приведена в формате svg. Я попытался загрузить его в файл html таким образом, чтобы я мог добавить элементы (например, круги) к (или поверх) файла svg или к div, в котором он находится. Вот два Подходы, которые я пробовал:d3 - Добавить элементы во внешний файл SVG

<script> 

d3.xml("bal.svg", "image/svg+xml", function(xml) { 
    document.body.appendChild(xml.documentElement); 
}); 

var circle = svg.append("circle") 
       .attr("cx", 100) 
       .attr("cy", 100) 
       .attr("r", 20) 
       .style("fill", "red"); 

</script> 

Изображение svg прекрасно выглядит, но круг не отображается. В Firefox, то html для внешнего svg файла отображается как:

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" 
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
width="250px" height="250px" viewBox="0 0 250 250" 
enable-background="new 0 0 250 250" xml:space="preserve"> 

Я также попытался:

<div id="htmlEmbed"></div> 

<script> 

d3.select("#htmlEmbed") 
.append("object") 
.attr("data", "tba2.svg") 
.attr("width", 500) 
.attr("height", 500) 
.attr("type", "image/svg"); 

d3.select("#htmlEmbed") 
.append("circle") 
.attr("cx", 600) 
.attr("cy", 600) 
.attr("r", 20) 
.style("fill", "red"); 

Опять же, SVG изображение выглядит прекрасно, но не круг не обнаруживается. В этом случае HTML показывает в браузере, как:

<object width="500" height="500" data="tba2.svg" type="image/svg"> 
#document 
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" 
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" 
width="500px" height="500px" viewBox="0 0 250 250" 
enable-background="new 0 0 250 250" xml:space="preserve"> … </svg> 
</object> 

У меня есть чувство, что это должно быть довольно просто сделать, но я не знаю. Любая помощь будет принята с благодарностью.

+0

В первом примере вы не сообщили нам, как определяется 'svg'. Обратите внимание, что вам может потребоваться добавить пространство имен svg для любых добавляемых вами элементов (например, '.append (« svg: circle »)). –

+0

Благодарим вас за ответ. В первом примере я явно не определял svg. Мое предположение заключалось в том, что, выполняя svg.append («круг»), код будет выбирать элемент svg изображения (который появляется в html из-за предыдущей строки). Как я могу сказать, чтобы использовать svg изображения? Кстати, если я открываю файл svg в текстовом редакторе и просто добавляю разметку с атрибутами cx, cy и открываю ее в браузере, круги выглядят отлично. Должен иметь способ добавить эти элементы d3, но я не знаю, как заставить его распознать SVG изображения. – whistler

+0

D3 не будет магически назначать переменные на основе того, что находится на странице. Вместо 'svg', попробуйте что-то вроде' d3.select ("svg") '. –

ответ

9

Были проблемы с кодом, который вы пробовали. Во-первых, вам нужно правильно определить svg, а во-вторых, вам нужно выполнить код, который изменяет SVG после его загрузки. Из-за асинхронного характера d3.xml это было не так.

Итак, код, который вам нужно запустить, это.

d3.xml("http://openvz.org/images/1/17/Warning.svg", function(xml) { 
    document.body.appendChild(xml.documentElement); 

    var circle = d3.select("svg").append("circle") 
      .attr("cx", 100) 
      .attr("cy", 100) 
      .attr("r", 20) 
      .style("fill", "red"); 
}); 

Работа скрипки (ограничения безопасности по модулю) here.

+0

Вау! Спасибо, что поняли это! Если в stackoverflow есть значок Genius, вы должны иметь его! – whistler

+0

Есть ли способ загрузить внешний SVG как обычные объекты, которые можно выбрать и управлять вне функции '' 'd3.xml'''? – Amyunimus

+0

Это уже так, проблема, как я уже сказал, заключается в том, что 'd3.xml' является асинхронным. По завершении загрузки вы можете делать все, что захотите, SVG. –

Смежные вопросы