How to clear a chart from a canvas so that hover events cannot be triggered?

后端 未结 21 1592
不思量自难忘°
不思量自难忘° 2020-11-28 20:07

I\'m using Chartjs to display a Line Chart and this works fine:

// get line chart canvas
var targetCanvas = document.getElementById(\'chartCanvas\').getConte         


        
相关标签:
21条回答
  • 2020-11-28 20:51

    We can update the chart data in Chart.js V2.0 as follows:

    var myChart = new Chart(ctx, data);
    myChart.config.data = new_data;
    myChart.update();
    
    0 讨论(0)
  • 2020-11-28 20:51

    Simple edit for 2020:

    This worked for me. Change the chart to global by making it window owned (Change the declaration from var myChart to window myChart)

    Check whether the chart variable is already initialized as Chart, if so, destroy it and create a new one, even you can create another one on the same name. Below is the code:

    if(window.myChart instanceof Chart)
    {
        window.myChart.destroy();
    }
    var ctx = document.getElementById('myChart').getContext("2d");
    

    Hope it works!

    0 讨论(0)
  • 2020-11-28 20:51

    For me this worked:

    		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 讨论(0)
  • 2020-11-28 20:55

    You should save the chart as a variable. On global scope, if its pure javascript, or as a class property, if its Angular.

    Then you'll be able to use this reference to call destroy().

    Pure Javascript:

    var chart;
    
    function startChart() {
        // Code for chart initialization
        chart = new Chart(...); // Replace ... with your chart parameters
    }
    
    function destroyChart() {
        chart.destroy();
    }
    

    Angular:

    export class MyComponent {
        chart;
    
        constructor() {
            // Your constructor code goes here
        }
    
        ngOnInit() {
            // Probably you'll start your chart here
    
            // Code for chart initialization
            this.chart = new Chart(...); // Replace ... with your chart parameters
        }
    
        destroyChart() {
            this.chart.destroy();
        }
    }
    
    0 讨论(0)
  • 2020-11-28 20:56

    I couldn't get .destroy() to work either so this is what I'm doing. The chart_parent div is where I want the canvas to show up. I need the canvas to resize each time, so this answer is an extension of the above one.

    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>');
    
    0 讨论(0)
  • 2020-11-28 20:57

    I had huge problems with this

    First I tried .clear() then I tried .destroy() and I tried setting my chart reference to null

    What finally fixed the issue for me: deleting the <canvas> element and then reappending a new <canvas> to the parent container


    My specific code (obviously there's a million ways to do this):

    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);
    };
    
    0 讨论(0)
提交回复
热议问题