ja gniazdowania wiele elementów wewnątrz elementu g tak:d3 kliknij i wydarzenie przeciągnij gniazdowania
<g>
<rect></rect>
<text></text>
...
</g>
Jednak istnieją pewne rects że chcą mieć możliwość zdarzenia przeciągnij własnych. Problem polega na tym, że kiedy umieszczasz materiał wewnątrz tagu g, jego rozmiar rozszerza się, by zawierał te tagi. Mimo, że mogę przypisać zdarzenia, nie ma możliwości ich uruchomienia, ponieważ wydarzenie z tagiem g jest jakoś ważniejsze, nawet jeśli rect jest na nim.
Czy istnieje sposób obejścia tego problemu?
EDYCJA: Oto a simple complete case w całości. Prostokąt i okrąg wewnątrz g. G jest przeciągalne, a kółko powinno być przeciągane, ale nie jest.
var gDragBehav = d3.behavior.drag()
.on('drag', gDragDrag)
function gDragDrag(d,i) {
d.x += d3.event.dx;
d.y += d3.event.dy;
d3.select(this)
.attr('x', d.x)
.attr('y', d.y)
.attr("transform", "translate(" + d.x + "," + d.y + ")");
}
var circleDragBehav = d3.behavior.drag()
.on('drag', circleDragDrag);
function circleDragDrag(d,i) {
console.log('dragging a circle')
d.cx += d3.event.dx;
d.cy += d3.event.dy;
d3.select(this)
.attr('cx', d.cx)
.attr('cy', d.cy)
}
var svg = d3.select('body').append('svg')
var g = svg.selectAll('g').data([{x: 10, y:10}])
.enter().append('g').call(gDragBehav)
g.append('rect').attr('width', 100).attr('height', 100)
g.selectAll('circle').data([{cx: 0, cy:0}])
.enter().append('circle')
.attr('cx', function(d) { return d.cx }).attr('cy', function(d) { return d.cy })
.attr('r', 40)
.call(circleDragBehav)
EDIT: Oto niektóre z kodu
var group = this.d3svg.selectAll('g' + '.' + this.className)
.attr('x', this.drawFuncs['x'])
.attr('y', this.drawFuncs['y'])
.attr("transform", this.drawFuncs['translate'])
.attr('class', this.className)
.call(gDragBehav)
.on('click', blockClickMenu)
ports = ['AtomicPort']
for (port in ports) {
drawPort.call(this, group, ports[port])
}
function drawPort(d3svg, portName, redraw) {
d3svg.selectAll('rect.' + portName)
.data(function(d) { return d.ports[ portName ] })
.enter().append('rect')
.attr('x', this.drawFuncs['x'])
.attr('y', this.drawFuncs['y'])
.attr('width', this.drawFuncs['width'])
.attr('height', this.drawFuncs['height'])
.attr('class', portName)
.call(portDragBehav)
var portDragBehav = d3.behavior.drag()
.on('drag', portDragDrag);
function portDragDrag(d,i) {
d.x += d3.event.dx;
d.y += d3.event.dy;
d3.select(this)
.attr('x', d.x)
.attr('y', d.y)
d3.event.stopPropagation();
}
var gDragBehav = d3.behavior.drag()
.on('dragstart', gDragStart)
function gDragDrag(d,i) {
d.x += d3.event.dx;
d.y += d3.event.dy;
d3.select(this)
.attr('x', d.x)
.attr('y', d.y)
.attr("transform", "translate(" + d.x + "," + d.y + ")");
d3.event.stopPropagation(); //Uncaught TypeError: Object #<Object> has no method 'stopPropagation'
}
Przywiązuję zachowanie drag do samego elementu g, aby wszystko w ciele g mogło się poruszać. Problem polega na tym, że elementy wewnątrz znacznika g nie były w ogóle wywoływane. Nie jestem pewien, co to za problem, ale nie mam do czynienia z wydarzeniem. Jak mogę nazwać stopPropagation? – ballaw
@ballaw To dobra (ale oczekiwana) informacja. To nie zmienia mojej odpowiedzi. – Phrogz
OK, ale nie mam żadnego kontaktu z wydarzeniem. Jak mogę nazwać stopPropagation? – ballaw