2015-06-09 10 views
6

Jestem w stanie kliknąć węzeł D3, aby uzyskać alert(); wiadomość. Jestem też w stanie przeciągnąć węzeł D3, ale przeciąganie powoduje również kliknięcie po zwolnieniu myszy.Zapobieganie kliknięciu podczas przeciągania węzła D3

Czy istnieje sposób, aby zapobiec kliknięciu po przeciągnięciu węzła?

To właśnie nazywam drag: poniżej

var node = svg.selectAll(".node") 
    .data(graph.nodes) 
    .enter() 
    .append("g") 
    .attr("transform", function(d){return "translate("+d.x+","+d.y+")"}) 
    .on("click", function(d){ 
     if(d.user_id != "" && d.user_id != null){ 
      parent.parent.openUserProfile(d.user_id); 
     } 
    }) 
    .call(force.drag); 

Jedna odpowiedź sugeruje, dodając coś jak ten kod (poniżej), ale myślę, że powyższy kod także musi zostać zmodyfikowany, aby uczynić je ze sobą współpracować.

var drag = d3.behavior.drag(); 
drag.on("dragend", function() { 
    d3.event.sourceEvent.stopPropagation(); // silence other listeners 
}); 
+0

próbowałeś e.preventDefault? (gdzie e, jest zdarzeniem kliknięcia) – Tim

+1

to, co zrobiłem, dotyczyło innego naciśnięcia przycisku, więc mogę kliknąć i przeciągnąć, ale aby faktycznie kliknąć (wybrać) węzeł muszę nacisnąć w dół shift + lewy przycisk myszy, aby to zrobić. Nie wiem, czy chcesz się do tego zaglądać, po prostu pomysł :) – thatOneGuy

+0

z drugim pytaniem nie przekazywać force.drag do funkcji wywołania, przekazać zmienną przeciągnięcia do niej tak: .call (przeciągnij) – thatOneGuy

Odpowiedz

7

Jako docs wspomniał:

Przy łączeniu zachowań przeciągnij innych detektorów zdarzeń dla zdarzeń interakcji, można również rozważyć zatrzymanie rozprzestrzeniania się na razie źródłowym, aby zapobiec wielu działań.

var drag = d3.behavior.drag(); 
selection.call(drag); 

drag.on("dragend", function() { 
    d3.event.sourceEvent.stopPropagation(); // silence other listeners 
}); 
+0

Zaktualizowałem powyższe pytanie. Czy pierwszy blok kodu, który wysłałem, musi zostać zmieniony, aby użyć "var drag"? – user1515295

+1

Nie mam wielkiego pojęcia o API 'd3', ale wierzę, że możesz teraz użyć' call (drag) 'zamiast' call (force.drag) '. 'dragend' handler jest dołączony do przeciągania, więc może być umieszczony niezależnie w zakresie' przeciągania'. Czy to ma sens? – Rohit416

+0

Oznaczyłem to jako zaakceptowaną odpowiedź. Dziękuję Ci. Powinienem był wspomnieć w moim pytaniu, że moim przypadkiem użycia był wykres kierowany siłą. Okazuje się, że ma dodatkową opcję, która znajduje się na dole strony https://github.com/mbostock/d3/wiki/Force-Layout, która jest następująca: selection.on ("click", function (d) { if (d3.event.defaultPrevented) return; otherwiseDoAwesomeThing();}); – user1515295

Powiązane problemy