Mam zdefiniowane pewne zachowanie przeciągania, który działa zgodnie z oczekiwaniami w następujący sposób (kod w coffeescript):Jak zapobiec przeciągnięciu przez d3 po kliknięciu prawym przyciskiem myszy?
nodeDrag = d3.behavior.drag()
.on("dragstart", (d, i) ->
force.stop())
.on("drag", (d, i) ->
d.px += d3.event.dx
d.py += d3.event.dy
d.x += d3.event.dx
d.y += d3.event.dy
tick())
.on("dragend", (d, i) ->
force.resume()
d.fixed = true
tick())
// ...
nodes = vis.selectAll(".node")
.data(graph.nodes)
.enter()
.append("g")
// ...
.call(nodeDrag)
ja teraz staram się tworzyć niestandardowe zachowanie dla prawych kliknięć na węzłach. Jednak powoduje to "dragstart" i "przeciąganie", tj. Po wywołaniu e.preventDefault()
w przypadku zdarzenia "contextmenu", węzeł, o którym mowa, jest przyklejony do wskaźnika myszy i podąża za nim, dopóki nie wykonam kolejnego (lewego) kliknięcia, aby wymusić zwolnienie (Zakładam, że e.preventDefault()
powoduje również "dragend", aby nigdy nie strzelać).
Znalazłem krótkie omówienie tego problemu w thread on Google Groups i discussion in d3's issues on Github. Jednak nie mogę zrozumieć tych komentarzy, jak zapobiec temu zjawisku.
Jak nie można uruchomić przeciągania po kliknięciu prawym przyciskiem myszy?
W zdarzeniu 'dragstart' możesz sprawdzić, czy kliknięto prawym przyciskiem myszy (używając d3.zdarzenie), a jeśli tak, nie wywołaj 'force.stop()'. –
Jak mogę sprawdzić, który przycisk myszy został kliknięty w 'd3.event'? Wszystkie sugestie, które mogę znaleźć, takie jak 'which',' button' i 'keyCode', dają mi' undefined'. Poza tym: nazywam 'force.stop()', aby zatrzymać algorytm układu podczas przeciągania użytkownika. Więc nie wywołanie go nie przeszkodzi w tym, że nastąpi gest przeciągania. – notan3xit
Myślę, że 'd3.event' ma element' sourceEvent' lub coś podobnego, co daje dostęp do rzeczywistego zdarzenia. I tak, potrzebujesz czegoś takiego jak 'preventDefault()'. –