【问题标题】:How to add an on click event to my Line chart using Chart.js如何使用 Chart.js 向我的折线图添加点击事件
【发布时间】:2014-10-20 07:24:58
【问题描述】:

我正在尝试使用Chart.js 将点击事件添加到我的折线图中。我已经启用了工具提示来显示折线图中的信息,但我还想添加一个点击方法,让我知道用户在 x 轴上点击的位置。现在我只想弹出一个警报,给我用户点击的 x 轴上的值。

研究:

我查看了documentation of Chart.js,发现了这个方法:.getPointsAtEvent(event)

在您的 Chart 实例上调用 getPointsAtEvent(event) 传递一个 事件或 jQuery 事件的参数将返回点元素 与该事件的位置相同。

canvas.onclick = function(evt){
    var activePoints = myLineChart.getPointsAtEvent(evt);
    // => activePoints is an array of points on the canvas that are at the same position as the click event. };

我只是不知道如何使用或在我的代码中放置函数的位置。如果有人能帮我弄清楚我可以在哪里将它添加到我的代码中,将不胜感激!

我的代码:(在 javascript 中)

  //NOTE: the div 'roomForChart' has been already declared as <div id="roomForChart"></div>


 //creating html code inside of javascript to display the canvas used for the graph
 htmlForGraph = "<canvas id='myChart' width ='500' height='400'>";
 document.getElementById('roomForChart').innerHTML += htmlForGraph;

 //NOW TO CREATE DATA

   //the data for my line chart
    var data = {
         labels: ["Aug 1", "Aug 2", "Aug 3","Aug 4","Aug 5"], //the x axis
          datasets: [
            {   //my red line
                label: "Usage Plan",
                fillColor: "rgba(255,255,255,0.2)", //adds the color below the line
                strokeColor: "rgba(224,0,0,1)",//creates the line
                pointColor: "rgba(244,0,0,1)",
                pointStrokeColor: "#fff",
                pointHighlightFill: "#fff",
                pointHighlightStroke: "rgba(220,220,220,1)",
                data: [1024, 1024, 1024, 1024, 1024]
           },

       {    //my green line
            label: "Overall Usage",
            fillColor: "rgba(48,197,83,0.2)",
            strokeColor: "rgba(48,197,83,1)",
            pointColor: "rgba(48,197,83,1)",
            pointStrokeColor: "#fff",
            pointHighlightFill: "#fff",
            pointHighlightStroke: "rgba(48,197,83,1)",
            data: [15, 25, 45, 45, 1500]
       },
        {  //my blue line
            label: "Daily Usage",
            fillColor: "rgba(151,187,205,0.2)",
            strokeColor: "rgba(151,187,205,1)",
            pointColor: "rgba(151,187,205,1)",
            pointStrokeColor: "#fff",
            pointHighlightFill: "#fff",
            pointHighlightStroke: "rgba(151,187,205,1)",
            data: [15, 10, 20, 0, 5]
       }

     ] //ending the datasets
     }; //ending data


    //creating a variable for my chart
    var ctx = document.getElementById("myChart").getContext("2d");




//code to create a maximum y value on the chart
var maxUsage = 1024;
var maxSteps = 5;
var myLineChart = new Chart(ctx).Line(data, {
    pointDot: false,
    scaleOverride: true,
    scaleSteps: maxSteps,
    scaleStepWidth: Math.ceil(maxUsage / maxSteps),
    scaleStartValue: 0

});

 //what I have tried but it doesn't show an alert message
ctx.onclick = function(evt){
    var activePoints = myLineChart.getPointsAtEvent(evt);
    // => activePoints is an array of points on the canvas that are at the same position as the click event.
   alert("See me?");
};

对于那些难以在此处可视化图表的人:

希望我已经提供了足够的信息来获得帮助。如果我需要解释自己,请告诉我。先感谢您!!! :)

【问题讨论】:

    标签: javascript charts onclick linechart chart.js


    【解决方案1】:

    如果您使用的是新的 ChartJs 版本,请使用:

    canvas.onclick = function(evt){
       var activePoints = myLineChart.getElementsAtEvent(evt);
    };
    

    【讨论】:

    • 谢谢兄弟,你节省了我的时间^_^!它非常适用于新的 charjs 版本。
    • 非常感谢。在 2.1.6 版本中解决了我的问题。
    【解决方案2】:

    改变这一行

    document.getElementById('roomForChart').innerHTML += htmlForGraph;
    

    到这里

    holder = document.getElementById('roomForChart');
    holder.innerHTML += htmlForGraph;
    

    你还会有你的 sn-p,稍微修改一下

    holder.onclick = function(evt){
        var activePoints = myLineChart.getPointsAtEvent(evt);
        // => activePoints is an array of points on the canvas that are at the same position as the click event.
       alert("See me?");
    };
    

    在 onclick 处理程序中添加 console.log(activePoints); 以查看 activePoints 变量的内容。如我所见,共有三个对象。例如,这些是 activePoints[0] 的值

    datasetLabel: "Usage Plan"
    fillColor: "rgba(244,0,0,1)"
    highlightFill: "#fff"
    highlightStroke: "rgba(220,220,220,1)"
    label: "Aug 4"
    strokeColor: "#fff"
    value: 1024
    x: 371
    y: 12.356097560975627
    

    它们可以通过以下方式访问

    activePoints[0].label
    activePoints[0].x
    activePoints[0].y
    activePoints[0].value
    

    最好先检查属性是否为undefined,因为每个点击事件背后都没有数据。

    【讨论】:

    • 你摇滚!我知道我很接近了!感谢您建议我使用支架。我从来没想过!
    • 快速提问!当我写 alert(activePoints);弹出一个警报,其中没有任何信息(我猜它是空的或空的)。我如何获取/提取这些信息?
    • @MadsterMaddness 我刚刚在读那部分;我会在几分钟内给你写一封信;只是为了弄清楚输出的格式。
    • @MadsterMaddness 关键是图表上的每个像素都没有数据,这就是为什么我在某个点击事件上收到undefined 错误。因此,只需在提醒或显示之前检查该属性是否为undefined ;) 并检查最后一次更新。
    • 我向 activePoints[0] 添加了控制台日志。结果我一直得到[信息],直到我点击图表时奇迹般地得到了:[信息](JavaScript.KKJSObject){值:1024d,标签:“8月5日”,datasetLabel:“使用计划” , strokeColor : "#fff", fillColor : "rgba(244,0,0,1)", ... } 为什么图表不能像工具提示一样将标签四舍五入到最接近的值?
    【解决方案3】:

    我无法让onclick 方法工作。

    但我终于设法使用click 方法运行它:

    $("#canvas_id").click(function(e) {
       var activeBars = myBarChart.getBarsAtEvent(e); 
       console.log(activeBars[0]);
    });
    

    注意:此示例适用于条形图 - 其他图表检索点的方法略有不同(请参阅文档)。

    【讨论】:

    • 我尝试使用这种方法,但它对我不起作用,我知道为什么。附加了单击事件我还调试了函数 getBarsAtEvent 但检索到的栏不是我刚刚单击的栏,或者有时只是没有检索任何数据。 getPointsAtEvent 是您可以在点击事件中传递的方法,它会在该事件的位置返回一个点数组,但在我的情况下有时会检索一个空数组。
    【解决方案4】:

    迄今为止提供的答案接近正确的解决方案,但不完整。您需要使用 getElementsAtEvent() 来获取正确的元素,但这会为您提供位于单击的 x-index 处的元素集合。即使您使用多个数据集,这也可能是多个值,每个数据集一个。

    要找出要从中提取的正确数据集,请调用 getDatasetAtEvent() 方法。这将返回包含单击的数据集元素的元素列表。从其中任何一个中选择数据集 Id,它们都是相同的 Id。

    将两者放在一起,您就可以计算出单击元素中包含的数据。在初始化数据集时传递的不仅仅是 x 和 y 值,还可以让你对这个事件做各种巧妙的技巧。 (例如,触发包含有关事件的更详细信息的弹出窗口)

    可能有一种更简洁的方式来获取这些数据,但我没有发现它在图表文档和票证周围乱七八糟。也许他们会在未来的版本中添加它。

    // chart_name is whatever your chart object is named. here I am using a
    // jquery selector to attach the click event.
    $('#' + chart_name).click(function (e)
    {
        var activePoints = myChart.getElementsAtEvent(event);
        var activeDataSet = myChart.getDatasetAtEvent(event);
    
        if (activePoints.length > 0)
        {
             var clickedDatasetIndex = activeDataSet[0]._datasetIndex;
             var clickedElementIndex = activePoints[0]._index;
             var value = myChart.data.datasets[clickedDatasetIndex].data[clickedElementIndex];
        }
        // todo: add code to do something with value.
    });
    

    【讨论】:

    • 你是英雄!
    【解决方案5】:

    V3

    您还可以使用 build in onClick 选项,它获取以下参数:(event, activeElements, chartInstance)

    因此,您只需读取作为第二个元素获得的数组,即可查看哪些元素处于活动状态。默认情况下,此数组仅包含 1 个项目,但如果您更改交互模式,此处可能会包含多个项目。

    var options = {
      type: 'bar',
      data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: 'pink'
          },
          {
            label: '# of Points',
            data: [7, 11, 5, 8, 3, 7],
            backgroundColor: 'orange'
          }
        ]
      },
      options: {
        onClick: (evt, activeElements, chart) => {
          console.log(`DatasetIndex: ${activeElements[0].datasetIndex} DataIndex: ${activeElements[0].index}`)
        }
      }
    }
    
    var ctx = document.getElementById('chartJSContainer').getContext('2d');
    new Chart(ctx, options);
    <body>
      <canvas id="chartJSContainer" width="600" height="400"></canvas>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.0/chart.js"></script>
    </body>

    在 v3 中,getElementsAtEvent 已被删除,现在您必须使用:chart.getElementsAtEventForMode(event, 'index', { intersect: true }, false)

    如果你想使用getDatasetAtEvent,你现在必须使用:chart.getElementsAtEventForMode(e, 'dataset', { intersect: true }, false)

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2016-09-04
      • 1970-01-01
      相关资源
      最近更新 更多