Подтвердить что ты не робот

Как очистить диаграмму от холста, чтобы события наведения не могли быть запущены?

Я использую Chartjs для отображения линейной диаграммы, и это отлично работает:

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

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

Но проблема возникает, когда я пытаюсь изменить данные для диаграммы. Я обновляю график, создавая новый экземпляр диаграммы с новыми точками данных и, таким образом, повторно инициализируя холст.

Это прекрасно работает. Однако, когда я наматываюсь на новую диаграмму, если я случайно перейду через определенные местоположения, соответствующие точкам, отображаемым на старой диаграмме, наведение/метка все еще срабатывает, и внезапно отображается старая диаграмма. Он остается видимым, когда моя мышь находится в этом месте и исчезает при движении с этой точки. Я не хочу, чтобы старый график отображался. Я хочу полностью удалить его.

Я попробовал очистить как холст, так и существующую диаграмму перед загрузкой новой. Как:

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

и

chart.clear();

Но никто из них не работал до сих пор. Любые идеи о том, как я могу остановить это?

4b9b3361

Ответ 1

У меня были огромные проблемы с этим

Сначала я попробовал .clear(), тогда я попробовал .destroy(), и я попытался установить ссылку на диаграмму на нуль

Что окончательно устранило проблему для меня: удаление элемента <canvas>, а затем повторное использование нового <canvas> в родительском контейнере


Мой специальный код (очевидно, существует миллион способов сделать это):

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);
};

Ответ 2

Я столкнулся с той же проблемой несколько часов назад.

Метод ".clear()" фактически очищает холст, но (видимо) он оставляет объект живым и реактивным.

Внимательно прочитав официальную документацию, в разделе "Расширенное использование" я заметил метод ".destroy()", описанный как следующим образом:

"Используйте это, чтобы уничтожить созданные экземпляры диаграмм. очистить любые ссылки, хранящиеся в объекте диаграммы в Chart.js, наряду с любыми связанными слушателями событий, прикрепленными Chart.js."

Он действительно делает то, что он утверждает, и он отлично справился со мной, я предлагаю вам попробовать.

Ответ 3

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});
}

Ответ 4

Это единственное, что сработало для меня:

document.getElementById("chartContainer").innerHTML = '&nbsp;';
document.getElementById("chartContainer").innerHTML = '<canvas id="myCanvas"></canvas>';
var ctx = document.getElementById("myCanvas").getContext("2d");

Ответ 5

У меня была такая же проблема здесь... Я попытался использовать метод destroy() и clear(), но без успеха.

Я решил это следующим образом:

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);

Это прекрасно работает для меня... Я надеюсь, что это поможет.

Ответ 6

Это работало очень хорошо для меня

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

Используйте .destroy, чтобы уничтожить созданные экземпляры диаграмм. Это очистит любые ссылки, хранящиеся в объекте диаграммы в Chart.js, а также любые связанные с ними прослушиватели событий, прикрепленные Chart.js. Это нужно вызвать до того, как холст будет повторно использован для новой диаграммы.

Ответ 7

Мы можем обновить данные диаграммы в Chart.js V2.0 следующим образом:

var myChart = new Chart(ctx, data);
myChart.config.data = new_data;
myChart.update();

Ответ 8

Используя CanvasJS, это поможет мне очистить график и все остальное, может работать и на вас, предоставив вам полностью установить холст/диаграмму перед каждой обработкой в ​​другом месте:

var myDiv= document.getElementById("my_chart_container{0}";
myDiv.innerHTML = "";

Ответ 9

Я не мог получить .destroy(), чтобы работать, так что это то, что я делаю. Диаграмма chart_parent - это то место, где я хочу показать холст. Мне нужно, чтобы размер был изменен каждый раз, поэтому этот ответ является расширением вышеупомянутого.

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>');

Ответ 10

Когда вы создаете один новый файл chart.js, это создает один новый скрытый iframe, вам нужно удалить холст и старое iframes.

$('#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 });

ссылка: https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html

Ответ 11

Если вы используете chart.js в Angular-проекте с Typescript, вы можете попробовать следующее;

Import the library:
    import { Chart } from 'chart.js';

In your Component Class declare the variable and define a method:

  chart: Chart;

  drawGraph(): void {
    if (this.chart) {
      this.chart.destroy();
    }

    this.chart = new Chart('myChart', {
       .........
    });
  }


In HTML Template:
<canvas id="myChart"></canvas>

Ответ 12

Для меня это сработало:

		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";

Ответ 13

У Chart.js есть ошибка: Chart.controller(instance) регистрирует любой новый график в глобальном свойстве Chart.instances[] и удаляет его из этого свойства на .destroy().

Но при создании диаграммы Chart.js также записывает свойство ._meta в переменную набора данных:

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
   };

и не удаляет это свойство на destroy().

Если вы используете старый объект набора данных без удаления ._meta property, Chart.js добавит новый набор данных к ._meta без удаления предыдущих данных. Таким образом, при каждой повторной инициализации диаграммы ваш объект набора данных накапливает все предыдущие данные.

Чтобы избежать этого, уничтожьте объект набора данных после вызова Chart.destroy().

Ответ 14

Это сработало для меня. Добавьте вызов в clearChart, вверху вашего updateChart()

'function clearChart() {
    event.preventDefault();
    var parent = document.getElementById('parent-canvas');
    var child = document.getElementById('myChart');          
    parent.removeChild(child);            
    parent.innerHTML ='<canvas id="myChart" width="350" height="99" ></canvas>';             
    return;
}'

Ответ 15

Так как разрушение разрушает "все", дешевое и простое решение, когда все, что вам действительно нужно, это просто "сбросить данные". Сброс ваших наборов данных в пустой массив также будет работать отлично. Итак, если у вас есть набор данных с метками и осью с каждой стороны:

window.myLine2.data.labels = [];
window.myLine2.data.datasets[0].data = [];
window.myLine2.data.datasets[1].data = [];

После этого вы можете просто позвонить:

window.myLine2.data.labels.push(x);
window.myLine2.data.datasets[0].data.push(y);

или, в зависимости от того, используете ли вы 2d набор данных:

window.myLine2.data.datasets[0].data.push({ x: x, y: y});

Это будет намного легче, чем полностью уничтожить весь ваш график/набор данных и перестроить все.

Ответ 16

Перед инициализацией новой диаграммы мы удалили/уничтожили экземпляр диаграммы предварительного просмотра, если он уже существует, а затем, например, создали новую диаграмму.

if(myGraf != undefined)
    myGraf.destroy();
    myGraf= new Chart(document.getElementById("CanvasID"),
    { 
      ...
    }

Надеюсь это поможет.