Функция щелчка Chartjs Overlap не работает

У меня простая линейная диаграмма, и у меня проблема, когда две или более точки находятся слишком близко. Проблема: во всплывающей подсказке отображается одна точка, а функция щелчка - для другой точки.

В этом примере вы можете видеть, что когда я нажимаю на первую точку красной линии (значение 2), событие щелчка происходит для черной линии (значение 0).

Пример: https://codepen.io/ataufo/pen/NexppY

var canvas = document.getElementById("lineChart");
var ctx = canvas.getContext('2d');


var data = {
  labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  datasets: [{
      label: "Stock A",
      fill: false,
      lineTension: 0.1,
      backgroundColor: "rgba(225,0,0,0.4)",
      borderColor: "red", 
      borderCapStyle: 'square',
      pointBorderWidth: 0.1,
      pointHoverRadius: 6,
      pointHoverBorderWidth: 2,
      pointRadius: 1,
      data: [2, 59, 80, 81, 56],
      spanGaps: false,
      datalabels: {
        enabled: true,
        allowOverlap: true,
        display: true,
        listeners: {
          click: function(context) {
            alert(context.dataIndex + " Red line");
          }
        }
          }
    }, {
      label: "Stock B",
      fill: false,
      lineTension: 0.1,
      backgroundColor: "black",
      borderColor: "black", 
      borderCapStyle: 'square',
      pointBorderWidth: 0.1,
      pointHoverRadius: 6,
      pointHoverBorderWidth: 2,
      pointRadius: 1,
      data: [0, 20, 60, 95, 64],
      spanGaps: false,
      datalabels: {
        enabled: true,
        allowOverlap: true,
        display: true,
        listeners: {
          click: function(context) {
            alert(context.dataIndex + " Black Line");
          }
        }
      }
    }

  ]
};

// Chart declaration:
var myBarChart = new Chart(ctx, {
  showTooltips: false,
  type: 'line',
  data: data
});

Есть ли у кого-нибудь идея решить это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
489
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы явно ссылаетесь на набор данных 0. Вам нужно передать индекс набора данных следующим образом:

canvas.onclick = function(evt) {
  var activePoints = myLineChart.getElementAtEvent(evt);
  //console.info(activePoints);
  if (activePoints[0]) {
    var chartData = activePoints[0]['_chart'].config.data;
    var idx = activePoints[0]['_index'];

    var label = chartData.labels[idx];

    // change the following line...
    //var value = chartData.datasets[0].data[idx];
    // to this:
    var value = chartData.datasets[activePoints[0]._chart.tooltip._active[0]._datasetIndex].data[idx];

    var url = "Mês:" + label + " Valor: " + value;
    alert(url);
  }
};

Редактировать: Полностью рабочий пример.

var canvas = document.getElementById("lineChart");
var ctx = canvas.getContext('2d');


    canvas.onclick = function(evt) {
      var activePoints = myLineChart.getElementAtEvent(evt);
      console.info(activePoints);
      if (activePoints[0]) {
        var chartData = activePoints[0]['_chart'].config.data;
        var idx = activePoints[0]['_index'];

        var label = chartData.labels[idx];
        //var value = chartData.datasets[0].data[idx];
        var value = chartData.datasets[activePoints[0]._chart.tooltip._active[0]._datasetIndex].data[idx];

        var url = "Mês:" + label + " Valor: " + value;
        alert(url);
      }
    };


var data = {
  labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
  datasets: [{
      label: "Stock A",
      fill: false,
      lineTension: 0.1,
      backgroundColor: "rgba(225,0,0,0.4)",
      borderColor: "red", 
      borderCapStyle: 'square',
      pointBorderWidth: 0.1,
      pointHoverRadius: 6,
      pointHoverBorderWidth: 2,
      pointRadius: 1,
      data: [2, 59, 80, 81, 56],
      spanGaps: false

    }, {
      label: "Stock B",
      fill: false,
      lineTension: 0.1,
      backgroundColor: "black",
      borderColor: "black", 
      borderCapStyle: 'square',
      pointBorderWidth: 0.1,
      pointHoverRadius: 6,
      pointHoverBorderWidth: 2,
      pointRadius: 1,
      data: [0, 20, 60, 95, 64],
      spanGaps: false
    }

  ]
};

// Chart declaration:
var myLineChart = new Chart(ctx, {
  type: 'line',
  data: data,
  options: {
    tooltips: {
         enabled: true
    }
  }

});
body{
  background-color: #666;
}

#lineChart{
  background-color: wheat;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>
<div class = "container">
  <br />
  <div class = "row">
    <div class = "col-md-1"></div>
    <div class = "col-md-10">
<!--       Chart.js Canvas Tag -->
      <canvas id = "lineChart"></canvas>
    </div>
    <div class = "col-md-1"></div>
  </div>
</div>

@VictorSoares Я проверил. Попробуйте полностью рабочий фрагмент, который я только что отредактировал в своем ответе. Это прямая копия вашего кодовый ключ, изменяющая только одну указанную мной строку.

timclutton 13.12.2018 23:33

Я вижу, но вы можете щелкнуть между черными и красными точками и увидеть. Я нажимаю на черную точку (январь: 0), и в предупреждении отображается красная точка (январь: 2). Выбранное значение не синхронизируется с отображением всплывающей подсказки.

Victor Soares 13.12.2018 23:39

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

Victor Soares 13.12.2018 23:44

Проблема заключается в перекрытии точек данных на 1 или 2 пикселя. Точки данных расположены так близко друг к другу, что вы, вероятно, сможете исправить это, только уменьшив радиус каждой из них, чтобы минимизировать перекрытие.

timclutton 13.12.2018 23:46

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

Victor Soares 13.12.2018 23:48

Что вы собираетесь делать с onclick?

timclutton 13.12.2018 23:49

Onclick вызовет функцию ajax и покажет некоторые данные с точки.

Victor Soares 13.12.2018 23:50

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

timclutton 14.12.2018 00:01

Теперь все идеально! Большое тебе спасибо!

Victor Soares 14.12.2018 00:52

Другие вопросы по теме