Как очистить диаграмму от холста, чтобы события наведения не могли быть вызваны?
Я использую 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();
но ни один из них не работал до сих пор. Есть идеи о том, как я могу остановить это?
12 ответов:
у меня были огромные проблемы с этим
сначала я пробовал
.clear()затем я попробовал.destroy()и я попытался установить ссылку на диаграмму в nullчто, наконец, исправил проблему для меня: удаление
<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); };
Я столкнулся с той же проблемой несколько часов назад.
The".clear () " метод фактически очищает холст, но (очевидно) он оставляет объект живым и реактивным.
читать внимательно официальная документация, в разделе "расширенное использование", я заметил метод".уничтожить()", описывается следующим образом:
" используйте это, чтобы уничтожить все созданные экземпляры диаграммы. Эта воля очистите все ссылки, сохраненные на диаграмме объект внутри диаграммы.js, вместе с любыми связанными прослушивателями событий, прикрепленными диаграммой.js."
Он на самом деле делает то, что он утверждает, и он отлично работает для меня, я предлагаю вам попробовать.
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}); }
это единственное, что сработало для меня:
document.getElementById("chartContainer").innerHTML = ' '; document.getElementById("chartContainer").innerHTML = '<canvas id="myCanvas"></canvas>'; var ctx = document.getElementById("myCanvas").getContext("2d");
у меня была такая же проблема здесь... Я попытался использовать метод destroy() и clear (), но безуспешно.
Я решил это следующим образом:
HTML:
<div id="pieChartContent"> <canvas id="pieChart" width="300" height="300"></canvas> </div>Javascript:
var pieChartContent = document.getElementById('pieChartContent'); pieChartContent.innerHTML = ' '; $('#pieChartContent').append('<canvas id="pieChart" width="300" height="300"><canvas>'); ctx = $("#pieChart").get(0).getContext("2d"); var myPieChart = new Chart(ctx).Pie(data, options);Он отлично работает для меня... Я надеюсь, что это поможет.
Это очень хорошо для меня
var ctx = $("#mycanvas"); var LineGraph = new Chart(ctx, { type: 'line', data: chartdata}); LineGraph.destroy();использовать .уничтожить это для уничтожения всех созданных экземпляров диаграммы. Это позволит очистить все ссылки, сохраненные на объект диаграммы в диаграмме.js, а также любые связанные прослушиватели событий, прикрепленные диаграммой.js. Это должно быть вызвано перед повторным использованием холста для новой диаграммы.
используя CanvasJS, это работает для меня очистка диаграммы и все остальное, может работать и для вас, предоставляя вам полностью настроить холст / диаграмму перед каждой обработкой в другом месте:
var myDiv= document.getElementById("my_chart_container{0}"; myDiv.innerHTML = "";
Я не смог .уничтожить() работать так это то, что я делаю. Chart_parent div-это то, где я хочу, чтобы холст появился. Мне нужно, чтобы холст менял размер каждый раз, поэтому этот ответ является расширением вышеупомянутого.
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>');
при создании новой диаграммы.JS canvas, это создает один новый скрытый 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
мы можем обновить данные диаграммы в диаграмме.js V2. 0 следующим образом:
var myChart = new Chart(ctx, data); myChart.config.data = new_data; myChart.update();
для меня это работает:
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";
диаграмма.js имеет ошибку:
Chart.controller(instance)регистрирует любую новую диаграмму в глобальном свойствеChart.instances[]и удаляет его из этого свойства.destroy().но при создании диаграммы диаграммы.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().если вы используете свой старый объект dataset без удаления
._meta property, диаграммы.js добавит новый набор данных в._metaбез удаления предыдущих данных. Таким образом, на каждом графике повторная инициализация объект dataset накапливает все предыдущие данные.чтобы избежать этого, уничтожьте объект dataset после вызова
Chart.destroy().
Comments