Как получить доступ к элементу DOM, который коррелирует с объектом D3 SVG?
Я пытаюсь узнать D3, экспериментируя с одним из их основные bubblecharts. Первая задача: выяснить, как перетащить пузырь и сделать его самым верхним объектом во время перетаскивания. (Проблема заключается в том, чтобы получить объектную модель D3 для отображения на DOM, но я доберусь туда...)
чтобы перетащить его, мы можем просто вызвать поведение перетаскивания d3, используя код, который они предоставляют:
var drag = d3.behavior.drag()
.on("dragstart", dragstart)
.on("drag", dragmove)
.on("dragend", dragend);
работает отлично. Тащит хорошо. Теперь, как мы можем получить его, чтобы быть самым верхним пунктом? Найдите "svg z-index" здесь, и быстро становится очевидным, что единственный способ изменить индекс-переместить объект дальше вниз в DOM. ЛАДНО. Они не делают это легко, потому что отдельные пузыри не имеют идентификаторов, но возиться с консолью, мы можем найти один из этих объектов пузыря с:
$("text:contains('TimeScale')").parent()
и мы можем переместить его в конец содержащего svg элемента с помощью:
.appendTo('svg')
перетащите его после того, как вы это сделаете, и это самый верхний элемент. До сих пор, так хорошо, если вы работаете полностью в DOM.
но: то, что я действительно хочу сделать, это то, что происходит автоматически всякий раз, когда данный объект/пузырь перетаскивается. D3 предоставляет модель для dragstart() и dragend() функции, которые позволят нам встроить оператор, чтобы делать то, что мы хотим во время процесса перетаскивания. И D3 обеспечивает d3.select(this) синтаксис, который позволяет нам получить доступ к Д3 представление объекта объекта / пузырька, который вы в настоящее время перетаскиваете. Но как могу ли я чисто превратить этот массивный массив, который они возвращают, в ссылку на элемент DOM, с которым я могу взаимодействовать, и, например, переместить его в конец контейнера svg или выполнить другие ссылки в DOM, такие как представление формы?
3 ответов:
вы также можете получить элемент DOM, представленный выделением через выбор.node () method
var selection = d3.select(domElement); // later via the selection you can retrieve the element with .node() var elt = selection.node();
любой элемент DOM в документе SVG будет иметь
ownerSVGElementсвойство, которое ссылается на документ SVG в.выбор D3 - это просто вложенные массивы с дополнительными методами на них; если у вас есть
.select()ed один элемент DOM, вы можете получить его с[0][0], например:var foo = d3.select(someDOM); // later, where you don't have someDOM but you do have foo var someDom = foo[0][0]; var svgRoot = someDom.ownerSVGElement;заметим, однако, что если вы используете
d3.select(this)затемthisуже и элемент DOM; вам не нужно обернуть его в выбор D3 только для того, чтобы разверните его.
Вы можете назначить идентификаторы и классы для отдельных элементов, если вы хотите, когда вы добавляете:
node.append("circle.bubble") .attr("r", function(d) { return d.r; }) .style("fill", function(d) { return fill(d.packageName); }) .attr("id", function(d, i) { return ("idlabel_" + i)}) .attr("class", "bubble") ;и затем вы можете выбрать по классу с selectAll("круг.пузырь") или выберите по идентификатору и измените атрибуты следующим образом:
var testCircle = svg.select("#idlabel_3") .style("stroke-width", 8);
Comments