2015-06-09 10 views
6

Sono in grado di fare clic su un nodo D3 per ottenere un alert(); Messaggio. Sono in grado di trascinare anche il nodo D3, ma il trascinamento attiva anche il comportamento del clic quando viene rilasciato il mouse.Previene l'azione di clic durante il trascinamento di un nodo D3

C'è un modo per impedire il comportamento del clic dopo aver trascinato il nodo?

Questo è dove io chiamo trascinamento:

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); 

Una risposta al di sotto suggerisce di aggiungere qualcosa di simile a questo codice (sotto), ma penso che il codice di cui sopra anche deve essere modificato per farli lavorare insieme.

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

hai provato e.preventDefault? (dove e, è l'evento di click) – Tim

+1

quello che ho fatto è stato un altro premere un pulsante, quindi posso fare clic e trascinare ma effettivamente fare clic (selezionare) il nodo che devo premere MAIUSC + tasto sinistro del mouse per farlo. Non so se vuoi dare un'occhiata a questo, solo un'idea :) – thatOneGuy

+0

con la tua seconda domanda non passare force.drag alla funzione di chiamata, passare la variabile di trascinamento ad esso in questo modo: .call (trascinamento) – thatOneGuy

risposta

7

Come il docs ha detto:

Quando si combinano comportamenti trascinare con altri listener di eventi per gli eventi di interazione, si può anche considerare fermare la propagazione sull'evento sorgente per prevenire azioni multiple.

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

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

Ho aggiornato la domanda di cui sopra. È necessario modificare il primo blocco di codice che ho postato per utilizzare "var drag"? – user1515295

+1

Non ho molta idea dell'API 'd3', ma credo che ora puoi usare' call (drag) 'invece di' call (force.drag) '. Il gestore di dragend' è collegato per trascinarlo in modo che possa essere posizionato indipendentemente nell'ambito di 'drag'. Ha senso? – Rohit416

+0

L'ho contrassegnato come risposta accettata. Grazie. Avrei dovuto menzionare nella mia domanda che il mio caso d'uso era il grafico della forza diretta. Si scopre che ha un'opzione aggiuntiva che è elencata in fondo a https://github.com/mbostock/d3/wiki/Force-Layout che è questa: selection.on ("click", function (d) { if (d3.event.defaultPrevented) return; altrimentiDoAwesomeThing();}); – user1515295

Problemi correlati