Этот вопрос настолько распространен, что я создал этот пример в документации. В примере рассматриваются элементы SVG, неправильно добавленные к SVG, но те же рассуждения применимы к элементам HTML, которые добавляются к SVG: вы должны знать, какие элементы могут иметь детей, а - то, что есть у детей. Подробнее в нижней части этой публикации.
Вкратце: вы не можете добавить какой-либо элемент HTML в SVG (за исключением использования foreignObject). Элемент появится в консоли, но не будет работать.
Примечание: Я отвечаю на ваш письменный вопрос и игнорирую ваш код, потому что, достаточно забавно, в вашем коде вы правильно добавляете элемент HTML в body
.
Правильно присоединени SVG элемент
Это довольно распространенная ошибка: Вы создали rect
элемент в виде гистограммы, например, и вы хотите добавить текстовую метку (скажем, значение этого бара). Итак, используя ту же переменную, которую вы использовали для добавления rect
и определите ее позицию x
и y
, вы добавляете свой элемент text
. Очень логично, вы можете подумать. Но это не сработает.
Как происходит эта ошибка?
Давайте посмотрим конкретный пример, базовый код для создания гистограммы (fiddle here):
var data = [210, 36, 322, 59, 123, 350, 290];
var width = 400, height = 300;
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var bars = svg.selectAll(".myBars")
.data(data)
.enter()
.append("rect");
bars.attr("x", 10)
.attr("y", function(d,i){ return 10 + i*40})
.attr("width", function(d){ return d})
.attr("height", 30);
Что дает нам этот результат:
Но вы хотите добавьте некоторые текстовые элементы, возможно, простое значение для каждого бара. Итак, вы делаете это:
bars.append("text")
.attr("x", 10)
.attr("y", function(d,i){ return 10 + i*40})
.text(function(d){ return d});
И, вуаля: ничего не происходит! Если вы сомневаетесь в этом, here is the fiddle.
«Но я вижу бирку!«
Если вы осмотрите SVG, созданный этим последним кодом, вы собираетесь увидеть это:
И в этот момент многие люди говорят:» Но я видя текстовый тег, он добавляется»Да, это так, но это не означает, что он будет работать Вы можете добавить ничего Смотрите это, например:..!
svg.append("crazyTag");
это даст вам этот результат:
<svg>
<crazyTag></crazyTag>
</svg>
Но вы не ожидаете результата только потому, что там есть тэг?
Append SVG элементы правильный путь
Узнайте, что SVG элементы могут держать детей, чтение specifications. В нашем последнем примере код не работает, потому что элементы rect
не могут содержать text
элементов. Итак, как отображать наши тексты?
Создать новую переменную, и добавьте text
в SVG:
var texts = svg.selectAll(".myTexts")
.data(data)
.enter()
.append("text");
texts.attr("x", function(d){ return d + 16})
.attr("y", function(d,i){ return 30 + i*40})
.text(function(d){ return d});
И это результат:
И here is the fiddle.
Я написал ответ, но я удалил его, потому что я запутался: в тексте, вы говорите, что вы прилагая выберите в SVG , но в вашем коде вы добавляете его в тело. Какой из них правильный? –
Кроме того, в вашем вопросе вы ссылаетесь на 'g # menu', хотя в вашем фрагменте id' menu' присваивается 'select'. Что-то здесь не так. – altocumulus
ОК, @gayathri, я восстановил свой ответ. Если вы добавляете его в SVG, посмотрите. Если вы добавляете его в тело, игнорируйте мой ответ. –