Comment effacer un diagramme d'une toile de sorte que les événements de vol stationnaire ne peuvent pas être déclenchés?

J'utilise Chartjs pour afficher un graphique linéaire et cela fonctionne très bien:

// get line chart canvas
var targetCanvas = document.getElementById('chartCanvas').getContext('2d');

// draw line chart
var chart = new Chart(targetCanvas).Line(chartData);

mais le problème se produit quand j'essaie de changer les données pour le graphique. Je mets à jour le graphique en créant une nouvelle instance D'un graphique avec les nouveaux points de données, et ainsi réinitialiser la toile.

ça marche très bien. Cependant, lorsque je survole la nouvelle carte, si je survole des emplacements spécifiques correspondant aux points affichés sur l'ancienne carte, la le hover / label est encore déclenché et soudainement l'ancienne carte est visible. Il reste visible pendant que ma souris est à cet endroit et disparaît quand déplacer hors de ce point. Je ne veux pas que l'ancien tableau d'affichage. Je veux l'enlever complètement.

j'ai essayé de nettoyer à la fois la toile et la carte existante avant de charger la nouvelle. Comme:

targetCanvas.clearRect(0,0, targetCanvas.canvas.width, targetCanvas.canvas.height);

et

chart.clear();

mais aucun de ceux-ci n'a fonctionné jusqu'à présent. Toutes les idées comment je peux empêcher cela?

77
demandé sur neaumusic 2014-07-18 05:02:04

12 réponses

j'ai eu d'énormes problèmes avec ce

D'abord j'ai essayé .clear() puis j'ai essayé .destroy() et j'ai essayé de définir ma référence graphique à null

ce qui a finalement réglé la question pour moi: supprimer l'élément <canvas> et ensuite remettre un nouveau <canvas> dans le conteneur parent


mon code spécifique (évidemment il y a un million de façons de le faire):

var resetCanvas = function(){
  $('#results-graph').remove(); // this is my <canvas> element
  $('#graph-container').append('<canvas id="results-graph"><canvas>');
  canvas = document.querySelector('#results-graph');
  ctx = canvas.getContext('2d');
  ctx.canvas.width = $('#graph').width(); // resize to parent width
  ctx.canvas.height = $('#graph').height(); // resize to parent height
  var x = canvas.width/2;
  var y = canvas.height/2;
  ctx.font = '10pt Verdana';
  ctx.textAlign = 'center';
  ctx.fillText('This text is centered on the canvas', x, y);
};
93
répondu neaumusic 2016-07-13 20:09:26

j'ai fait face au même problème il y a quelques heures.

La ".la méthode clear()" efface en fait la toile, mais (évidemment) elle laisse l'objet vivant et réactif.

en Lisant attentivement la documentation officielle , dans les "utilisation Avancée" de la section, j'ai remarqué que la méthode ".destroy()", décrit comme suit:

" utilisez ceci pour détruire toutes les instances graphiques qui sont créées. Ce sera nettoyer toutes les références stockées à l'objet graphique dans le Diagramme.js, avec tous les écouteurs d'événements associés attachés par Graphique.js."

il fait en fait ce qu'il prétend et il a bien fonctionné pour moi, je vous suggère de lui donner un essai.

30
répondu Roberto Pierpaoli 2014-07-20 19:56:39
var myPieChart=null;

function drawChart(objChart,data){
    if(myPieChart!=null){
        myPieChart.destroy();
    }
    // Get the context of the canvas element we want to select
    var ctx = objChart.getContext("2d");
    myPieChart = new Chart(ctx).Pie(data, {animateScale: true});
}
22
répondu xchiltonx 2015-05-26 20:58:23

C'est la seule chose qui a fonctionné pour moi:

document.getElementById("chartContainer").innerHTML = '&nbsp;';
document.getElementById("chartContainer").innerHTML = '<canvas id="myCanvas"></canvas>';
var ctx = document.getElementById("myCanvas").getContext("2d");
9
répondu Eric 2015-08-14 18:56:20

j'ai eu le même problème ici... J'ai essayé d'utiliser la méthode destroy () et clear (), mais sans succès.

Je l'ai résolu de la manière suivante:

HTML:

<div id="pieChartContent">
    <canvas id="pieChart" width="300" height="300"></canvas>
</div>

Javascript:

var pieChartContent = document.getElementById('pieChartContent');
pieChartContent.innerHTML = '&nbsp;';
$('#pieChartContent').append('<canvas id="pieChart" width="300" height="300"><canvas>');

ctx = $("#pieChart").get(0).getContext("2d");        
var myPieChart = new Chart(ctx).Pie(data, options);

ça me va parfaitement... J'espère que Cela aide.

4
répondu Javier Muñoz 2015-08-12 07:29:22

cela a très bien fonctionné pour moi

    var ctx = $("#mycanvas");
     var LineGraph = new Chart(ctx, {
        type: 'line',
        data: chartdata});
        LineGraph.destroy();

utiliser .détruire ceci pour détruire toutes les instances graphiques qui sont créées. Cela nettoiera toutes les références stockées à l'objet graphique dans la carte.js, ainsi que tous les écouteurs d'événements associés attachés par Graphique.js. Cela doit être appelé avant que la toile soit réutilisée pour une nouvelle carte.

4
répondu Nicholas Macharia 2016-08-04 06:56:50

à L'aide de CanvasJS, cela fonctionne pour moi de déblayer la carte et tout le reste, pourrait fonctionner pour vous aussi, vous accordant de mettre votre toile/carte entièrement en place avant chaque traitement ailleurs:

var myDiv= document.getElementById("my_chart_container{0}";
myDiv.innerHTML = "";
1
répondu aggaton 2015-08-20 03:45:47

Je n'ai pas pu .destroy() pour travailler donc c'est ce que je fais. La div chart_parent est là où je veux que la toile apparaisse. J'ai besoin de la toile pour redimensionner à chaque fois, donc cette réponse est une extension de la ci-dessus.

HTML:

<div class="main_section" > <div id="chart_parent"></div> <div id="legend"></div> </div>

JQuery:

  $('#chart').remove(); // this is my <canvas> element
  $('#chart_parent').append('<label for = "chart">Total<br /><canvas class="chart" id="chart" width='+$('#chart_parent').width()+'><canvas></label>');
1
répondu Chris 2015-11-18 07:36:15

Lorsque vous créez un nouveau graphique.js canvas, cela génère une nouvelle iframe cachée, vous devez supprimer la toile et les iframes olds.

$('#canvasChart').remove(); 
$('iframe.chartjs-hidden-iframe').remove(); 
$('#graph-container').append('<canvas id="canvasChart"><canvas>'); 
var ctx = document.getElementById("canvasChart"); 
var myChart = new Chart(ctx, { blablabla });

de référence: https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html

1
répondu zebus3d 2016-06-10 22:06:24

nous pouvons mettre à jour les données de carte dans la carte.js V2.0 comme suit:

var myChart = new Chart(ctx, data);
myChart.config.data = new_data;
myChart.update();
1
répondu Sam G 2017-04-24 12:56:29

pour moi cela a fonctionné:

		var in_canvas = document.getElementById('chart_holder');
	//remove canvas if present
			while (in_canvas.hasChildNodes()) {
				  in_canvas.removeChild(in_canvas.lastChild);
				} 
	//insert canvas
			var newDiv = document.createElement('canvas');
			in_canvas.appendChild(newDiv);
			newDiv.id = "myChart";
0
répondu Scrapie 2015-09-17 09:27:54

Chart.js a un bug: Chart.controller(instance) enregistre tout nouveau graphique dans une propriété globale Chart.instances[] et le supprime de cette propriété sur .destroy() .

mais à la carte de création de carte.js écrit aussi ._meta propriété de la variable dataset:

var meta = dataset._meta[me.id];
if (!meta) {
   meta = dataset._meta[me.id] = {
       type: null,
       data: [],
       dataset: null,
       controller: null,
       hidden: null,     // See isDatasetVisible() comment
       xAxisID: null,
       yAxisID: null
   };

et il ne supprime pas cette propriété sur destroy() .

si vous utilisez votre ancien objet dataset sans supprimer ._meta property , graphique.js va ajouter de nouvelles données ._meta sans suppression des données précédentes. Ainsi, lors de la ré-initialisation de chaque graphique, votre objet dataset accumule toutes les données précédentes.

pour éviter cela, détruisez l'objet dataset après avoir appelé Chart.destroy() .

0
répondu Andrew Hudik 2016-08-12 15:33:27