Chart.js canvas,如何交换数据而又不影响先前的悬停事件?

时间:2019-01-25 06:15:30

标签: javascript object chart.js

使用chart.js,我建立了一些条形图。我换出数据以显示不同的点击图。加载页面显示一切正常。

<div id="chart-container">
  <button class="dataSelector" onclick="dataSwap('webDevData')">WebDev Tools</button>
  <button class="dataSelector" onclick="dataSwap('graphicsData')">Graphic Design Tools</button>
  <div class="chart-window">
    <canvas id="myChart"></canvas>
  </div>
</div>

在加载页面时,将初始化图表,并正确创建和呈现图表对象。调用我的swapData函数后,其他数据集将正确呈现,但是此后,旧数据集仍会响应将鼠标悬停在图表上。

我的功能看起来像这样。

<script type="text/javascript">

//set both sets of data in variables

var lablesWebDev = ["CSS", "JAVASCRIPT", "PYTHON", "PHP", "RUBY", "SQL", "PERL"];
var dataWebDev = [3.5, 3.5, 1, 1.5, 0.5, 1, 0.5];
var lablesGraphic = ["Photoshop", "Illustrator", "GIMP", "BLENDER", "FreeCAD", "Photography"];
var dataGraphic = [1.5, 1.1, 2.5, 2.0, 0.8, 3.0];


function dataSwap(dataType){

//check argument for which data set to render

  if (dataType == "webDev"){
    var labelsChosen = lablesWebDev;
    var dataChosen = dataWebDev;
  }else if (dataType == "graphic"){
    var labelsChosen = lablesGraphic;
    var dataChosen = dataGraphic;
  }

//grab the canvas and initialize the chart following documentation.

Chart.defaults.global.defaultFontColor = 'black';
var ctx = document.getElementById("myChart");
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {                    //variables placed below
        labels: labelsChosen,
        datasets: [{
            label: 'Years Experience',
            data: dataChosen,
            backgroundColor: 'rgba(255, 50, 80, 0.5)',
            borderColor: 'rgba(255, 50, 80, 1)',
            borderWidth: 1
         }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }]
        }
    }
});
}dataSwap("webDev");
</script>

如何重新初始化此图表对象,以使先前的数据集不再存在?或者至少我该如何禁用悬停事件,以便完全绕过此问题?

感谢智慧!

3 个答案:

答案 0 :(得分:2)

有一个选项可以通过.clear()方法清除图表。这将清除现有图表。还有一个.destroy()选项可以破坏图表。

//This would destroy the chart.
    var mychart = new Chart(xyaz, myNinjaConfig);
    mychart.destroy();


//This would clear. the chart.
    const mychart = new Chart (xyaz, myNinjaConfig);
    mychart.clear();

答案 1 :(得分:1)

您可以将选项更改为仅监听点击事件:

    options: {
        events: ['click'],
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }]
        },
    }

这只会在您单击显示时更改显示。

答案 2 :(得分:0)

我无法通过将myChart声明为var或const来访问任何方法。最后,通过声明

this.myChartInstance = new Chart(ctx, { ... //WORKS!!
var myChartInstance = new Chart(ctx, { ... //doesnt work
const myChartInstance = new Chart(ctx, { ... //doesnt work

我现在可以从控制台调用destroy方法。

在重新初始化我的数据之前添加条件检查,效果很好!!我可以将鼠标悬停在图形上并交换数据而不会发生任何冲突。解决方案:

if (this.myChartInstance) {
    this.myChartInstance.destroy();
}
this.myChartInstance = new Chart(ctx, { ...