javascript - ChartJs Canvas 在更改图形类型时显示以前的图形

标签 javascript canvas chart.js

我遇到了一个独特的事件,当用户从下拉列表中进行选择时,如果您在 Canvas 上扫描,图表会发生变化,那么之前的图表会像幽灵一样出现在背景中。我知道你可以使用 graph.destroy() 之类的东西,但我不确定这是否合适以及将它放在哪里。

更新图表的代码

var ctx = document.getElementById("myChart").getContext("2d");
    ctx.canvas.width = 600;
    ctx.canvas.height = 200;

    function updateChart() {
        //  ctx.canvas.destroy();
        var determineChart = $("#chartType").val();

        var params = dataMapMain[determineChart];
        if ([params.method] == "Pie") {
            document.getElementById("subOption").hidden = false;
            document.getElementById("arrowId").hidden = false;

    var determineChart = $("#subOption").val();
            var params = dataMapSub[determineChart];
            $('#subOption').on('change', updateChart);

            new Chart(ctx)[params.method](params.data, options, {});

        }
        else {
            document.getElementById("subOption").hidden = true;
            document.getElementById("arrowId").hidden = true;
            new Chart(ctx)[params.method](params.data, options, {});
        }
    }

    $('#chartType').on('change', updateChart)
    updateChart();

enter image description here

fiddle演示问题,将鼠标悬停在图表上以查看“ghost”。

最佳答案

因为您没有销毁不再使用的 Chart 实例,chartjs 正在将多个图表绘制到同一个 Canvas 上下文中。

您需要引用您新建Chart 实例,以便能够在您 之前对它们调用destroy新的另一个。

将此添加到您的代码中:

var ctx = document.getElementById("myChart").getContext("2d");
    ctx.canvas.width = 600;
    ctx.canvas.height = 200;

var chart; // assign your chart reference to this variable

function updateChart() {
    var determineChart = $("#chartType").val();

    var params = dataMapMain[determineChart];
    if ([params.method] == "Pie") {
        document.getElementById("subOption").hidden = false;
        document.getElementById("arrowId").hidden = false;

var determineChart = $("#subOption").val();
        var params = dataMapSub[determineChart];
        $('#subOption').on('change', updateChart);

        chart && chart.destroy(); // destroy previous chart
        chart = new Chart(ctx)[params.method](params.data, options, {});

    }
    else {
        document.getElementById("subOption").hidden = true;
        document.getElementById("arrowId").hidden = true;

        chart && chart.destroy(); // destroy previous chart
        chart = new Chart(ctx)[params.method](params.data, options, {});
    }
}

$('#chartType').on('change', updateChart)
updateChart();

这是一个 fiddle这证明了修复。

关于javascript - ChartJs Canvas 在更改图形类型时显示以前的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33280757/

相关文章:

javascript - ChartJS - 从服务器端注入(inject)数据

javascript - 将变量从 PHP 移动到 Javascript 小部件

javascript - 在 Canvas 上使用keyEvent的addEventListener

javascript - 我怎样才能取消所有未决的 $timeouts?

javascript - Canvas fillText 不渲染

JavaScript 执行失败 'drawImage'

javascript - Chart.js 未启动

javascript - 将自定义标签添加到堆叠条形图的顶部或底部

javascript - 当我选择不同的值时,如何使我的单选按钮再次变得清晰?

javascript - 解析服务器登录返回一个用户,但 req.user 未定义