2015-05-05 13 views
7

Ho il seguente codice che sfrutta la libreria ChartJS.Diagramma a linee di ChartJs ridisegnare il glitch mentre si passa il mouse su

/*assume the tags in the right place */ 

<canvas id="graph1" width="300" height="300"></canvas> 

var ctx = $("#graph1").get(0).getContext("2d"); 
var myChart = new Chart(ctx).Line(graph1Generator("day")); 

... tutto funziona bene, ma dopo aver aggiunto il seguente gestore di eventi per cancellare e ridisegnare la stessa tabella con dati diversi, si verifica un problema tecnico.

weekButton.addEventListener("click", function(){ 
    ctx.clearRect (0, 0, 300, 300); 
    ctx.canvas.width = 300; 
    ctx.canvas.height = 300; 
    myChart = new Chart(ctx).Line(graph1Generator("week")); 

Questo codice non ridisegna correttamente il grafico con i nuovi dati, ma quando mi passa il mouse su di esso, lo fa alcuni molto strani "flashback" per il vecchio grafico che avrebbe dovuto cancellare. Questo mi fa credere che non ha cancellato il vecchio.

+0

Penso che funzionerà se riutilizzerai il vecchio oggetto grafico invece di crearne uno nuovo nel gestore eventi. Puoi anche chiamare 'myChart.destroy();' prima di crearne uno nuovo, in alternativa. – Pointy

+0

Come posso riutilizzare il vecchio oggetto grafico con nuovi dati? Mentre i grafici sono gli stessi, hanno diversi tipi di dati. Inoltre, 'myChar.destroy();' sembra duplicare la dimensione del mio grafico dopo ogni evento. Perché sta succedendo? – ApathyBear

+0

Penso solo a 'myChart.Line (graph1generator (" week "));' (o qualsiasi altra cosa che devi fare per i nuovi dati). E invece di cancellare la tela con il tuo codice, lascia che Chart lo faccia: 'myChart.clear();'. (Potrebbe funzionare meglio di '.destroy()'; Non sono sicuro.) – Pointy

risposta

7

Here is an update to your fiddle. Il cambiamento primario (diverso da quello che fissa il nome di errore di battitura di funzione) è quello di aggiungere

myChart.destroy(); 

prima linea come

myChart = new Chart(ctx).Line(...); 

Il metodo .destroy() si sbarazza delle registrazioni del gestore di eventi, ecc, in modo da non dovresti vedere quegli strani "grafici fantasma" quando passi il mouse sopra la grafica.

+0

Il tuo jsfiddle funziona ma ha uno strano effetto collaterale. Sul violino, le altre tele iniziano ad aumentare esponenzialmente di dimensioni dopo l'esecuzione di ogni gestore di eventi. Nella mia pagina (test in safari), il grafico a linee sembra essere in misura esponenzialmente più grande. Sto eseguendo il tuo codice esatto, c'è un modo per non accadere? – ApathyBear

+0

@ApathyBear Non vedo nulla di più grande quando lo eseguo. Puoi anche aggiungere le chiamate '.destroy()' per gli altri grafici, ma questo non fa molta differenza quando lo provo. – Pointy

+0

@ApathyBear Ho provato Firefox e Chrome, e in nessun caso i grafici a torta e ad anello cambiano mai le dimensioni. – Pointy

Problemi correlati