2013-08-03 17 views
7

Vorrei utilizzare un pennello D3.js per consentire agli utenti di selezionare un intervallo di valori su un asse. Per impostazione predefinita, facendo clic all'esterno del pennello lo si cancella, in modo che non venga selezionato alcun intervallo.Disabilita la cancellazione del pennello D3.js

Tuttavia, desidero regolare questo comportamento in modo che facendo clic all'esterno del pennello non si modifichi l'estensione del pennello. In effetti, non ci dovrebbe essere modo di cancellare il pennello, alcuni intervalli dovrebbero sempre essere selezionati.

Credo di dover agganciare lo in qualche modo per disabilitare la compensazione, ma non so davvero come farlo.

Ecco un esempio del tipo di interfaccia di cui sto parlando (Fiddle). Quando fai clic a sinistra o a destra della barra nera, il pennello viene cancellato e la barra scompare.

Come faccio a disattivare questo comportamento?

risposta

7

d3 il pennello di design chiama "brushmove()" quando un utente preme un mouse sull'elemento del pennello (ad esempio sull'evento 'mousedown.brush'). Se effettivamente porta a ripristinare l'estensione del pennello precedente.

Una possibile soluzione è sostituire il gestore originale mousedown.brush con quello personalizzato. Il gestore personalizzato chiamerà i gestori originali solo dopo che il mouse è stato spostato dopo il mouse iniziale.

var brushNode = chart.append("g") 
    .call(brush); 

brushNode 
    .selectAll("rect") 
    .attr("y", -10) 
    .attr("height", 10); 

// store the reference to the original handler 
var oldMousedown = brushNode.on('mousedown.brush'); 

// and replace it with our custom handler 
brushNode.on('mousedown.brush', function() { 
    brushNode.on('mouseup.brush', function() { 
     clearHandlers(); 
    }); 

    brushNode.on('mousemove.brush', function() { 
     clearHandlers(); 
     oldMousedown.call(this); 
     brushNode.on('mousemove.brush').call(this); 
    }); 

    function clearHandlers() { 
     brushNode.on('mousemove.brush', null); 
     brushNode.on('mouseup.brush', null); 
    } 
}) 

Vedere demo.

+1

Ho avuto l'idea. Ma mi chiedo se hai ricevuto un errore del tipo: "Uncaught TypeError: Impossibile leggere la proprietà 'call' di undefined" quando si esegue questo codice, sembra che non ci sia alcun gestore di eventi mousemove.brush associato a brushNode. – Kuan

+0

Ciao @kuan, hai risolto il problema? C'è qualche problema/effetti collaterali accaduti usando sopra la soluzione con errore ?? –

+1

@Nithin CV Poyyil No, questo sembra funzionare nell'esempio sopra, ma non funziona nel mio caso. Il modo in cui utilizzo è: ricorda inizialmente l'estensione del pennello, e in brushend, se (! Brush.empty()) {ext = brush.extent();} else {brush.extent (ext); } e imposta il pennello e ridisegna l'asse – Kuan