2012-10-30 14 views
10

Ho una (piuttosto semplice) domanda: come "annullare la chiamata" force.drag su una selezione effettuata da D3.js? Diciamo che ho creato un insieme di elementi e chiamato "call" su di esso, dandogli il drag-callback di un layout force-directed. Sembra:D3.js: rimuovere force.drag da una selezione

d3.selectAll('rect').call(force.drag); 

Ora sarà possibile rimuovere tale comportamento da alcuni dei nodi in seguito. I miei approcci inclusi il ripristino diversi ascoltatori, come 'click', 'drag' ecc utilizzando

d3.select('rect#no-drag').on('click', null); 

Nessuno di loro ha lavorato. Qualcuno sa come rimuovere la richiamata?

risposta

19

Sei vicino. L'evento di trascinamento viene avviato da un evento mousedown con uno spazio dei nomi chiamato drag. Vedere: https://github.com/mbostock/d3/blob/master/src/behavior/drag.js#L5

Così, per rimuovere questo si potrebbe fare:

d3.select('rect#no-drag').on('mousedown.drag', null); 
+0

Questo lo risolve perfettamente, l'ho appena provato e funziona :) Gli eventi sono assegnati in modo predefinito per nome in D3.js? – user654123

+0

Sì. Inoltre, se si aggiungono i propri listener di eventi, può essere opportuno assegnare loro uno spazio dei nomi. Consentono di utilizzare più ascoltatori ascoltando lo stesso evento. – nautat

+0

Ok, conoscevo già gli eventi namespace dallo sviluppo di plug-in jQuery. Sembra che D3.js ti permetta di registrare solo un singolo callback per ogni evento qualificato, quindi ha senso per lo spazio dei nomi. Grazie ancora. – user654123

1

Questa linea in qualche modo non è cellulare compatibile (cromo/Android)

d3.select('rect#no-drag').on('mousedown.drag', null); 
2

Questa domanda è non chiedere come ho un controllo a grana fine sull'elemento di trascinamento, ma sono venuto qui cercando come attivare/disattivare il trascinamento in base alle condizioni, e il richiedente ha anche chiesto come ottenere il trascinamento dopo averlo rimosso nei commenti.

Pertanto, per chiunque cerchi come consentire l'evento di trascinamento condizionato, utilizzare drag.filter.

drag.filter accetta una richiamata che deve restituire un valore booleano. Se il callback restituisce true, si verifica il trascinamento, altrimenti il ​​trascinamento non viene attivato.

Questo è molto più pulito di rimuovere il trascinamento dalla selezione e quindi provare a riapplicarlo.

+0

Sei in ritardo al gioco ma il tuo commento è molto apprezzato, grazie! – user654123