ChartJs(版本:2.8.0)。如果在图表画布区域外点击(或移动鼠标指针),自定义工具提示不会隐藏。

问题描述 投票:0回答:1

我使用ChartJs (ver: 2.8.0)来渲染线型图,并使用了 自定义工具提示,将在 click 点的事件。

问题是当鼠标指针移动到图表画布区域之外时,自定义的工具提示不会隐藏。

为了使工具提示只在点的点击事件中可见,在图表选项中,我使图表只在点击事件中响应。

options: {
  events: ['click'],
.....
..

请告诉我以上的方法是否正确,在点击事件上显示工具提示,而不是任何其他事件。

这样一来,当鼠标在图表画布区域外移动(或点击)时,默认的图表js工具提示和自定义工具提示都不会自行隐藏。

谁能帮我解决这个问题?

下面是 链接到我的JS Fiddle实例

以下是我的完整代码。

JS:

var lineChartCustomTooltip = function (tooltip) {
  // Tooltip Element
  var tooltipEl = document.getElementById("chartjs-tooltip");

  if (!tooltipEl) {
    tooltipEl = document.createElement("div");
    tooltipEl.id = "chartjs-tooltip";
    tooltipEl.innerHTML = "<table></table>";
    this._chart.canvas.parentNode.appendChild(tooltipEl);
  }

  // Hide if no tooltip
  if (tooltip.opacity === 0) {
    tooltipEl.style.opacity = 0;
    return;
  }

  // Set caret Position
  tooltipEl.classList.remove("above", "below", "no-transform");
  if (tooltip.yAlign) {
    tooltipEl.classList.add(tooltip.yAlign);
  } else {
    tooltipEl.classList.add("no-transform");
  }

  function getBody(bodyItem) {
    return bodyItem.lines;
  }

  // Set Text
  if (tooltip.body) {
    var titleLines = tooltip.title || [];
    var bodyLines = tooltip.body.map(getBody);

    var innerHtml = "<thead>";

    titleLines.forEach(function (title) {
      innerHtml += "<tr><th>" + title + "</th></tr>";
    });
    innerHtml += "</thead><tbody>";

    bodyLines.forEach(function (body, i) {
      var colors = tooltip.labelColors[i];
      var style = "background:" + colors.backgroundColor;
      style += "; border-color:" + colors.borderColor;
      style += "; border-width: 2px";
      var span =
        '<span class="chartjs-tooltip-key" style="' + style + '"></span>';
      innerHtml += "<tr><td>" + span + body + "</td></tr>";
    });
    innerHtml += "</tbody>";

    var tableRoot = tooltipEl.querySelector("table");
    tableRoot.innerHTML = innerHtml;
  }

  var positionY = this._chart.canvas.offsetTop;
  var positionX = this._chart.canvas.offsetLeft;

  // Display, position, and set styles for font
  tooltipEl.style.opacity = 1;
  tooltipEl.style.left = positionX + tooltip.caretX + "px";
  tooltipEl.style.top = positionY + tooltip.caretY + "px";
  tooltipEl.style.fontFamily = tooltip._bodyFontFamily;
  tooltipEl.style.fontSize = tooltip.bodyFontSize + "px";
  tooltipEl.style.fontStyle = tooltip._bodyFontStyle;
  tooltipEl.style.padding = tooltip.yPadding + "px " + tooltip.xPadding + "px";
};

var options = {
  type: "line",
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [
      {
        label: "# of Votes",
        data: [12, 19, 3, 5, 2, 3],
        borderWidth: 1,
        borderColor: "red",
        pointBackgroundColor: "red",
      },
      {
        label: "# of Points",
        data: [7, 11, 5, 8, 3, 7],
        borderWidth: 1,
        borderColor: "blue",
        pointBackgroundColor: "blue",
      },
    ],
  },
  options: {
    events: ["click"],
    tooltips: {
      enabled: false, // disable the default tooltip
      custom: lineChartCustomTooltip, // use the custom tooltip
    },
    scales: {
      yAxes: [
        {
          ticks: {
            reverse: false,
          },
        },
      ],
    },
    title: {
      display: true,
      text: "Chart.js Line Chart - Custom Tooltips",
    },
  },
};

var ctx = document.getElementById("chartJSContainer").getContext("2d");
new Chart(ctx, options);

HTML: HTML:

<body>
    <canvas id="chartJSContainer" width="600" height="400"></canvas>
</body>

CSS:

canvas { background-color : #eee;
}

#chartJSContainer {
    border: 1px solid;
}

canvas {
      -moz-user-select: none;
      -webkit-user-select: none;
      -ms-user-select: none;
    }

    #chartjs-tooltip {
      opacity: 1;
      position: absolute;
      background: rgba(0, 0, 0, .7);
      color: white;
      border-radius: 3px;
      -webkit-transition: all .1s ease;
      transition: all .1s ease;
      pointer-events: none;
      -webkit-transform: translate(-50%, 0);
      transform: translate(-50%, 0);
    }

    .chartjs-tooltip-key {
      display: inline-block;
      width: 10px;
      height: 10px;
      margin-right: 10px;
    }
javascript html css charts chart.js
1个回答
0
投票

我找到了解决方案!只需添加 mouseout 事件到图表上 events 选项,我把它解决了。

现在,当鼠标移动或点击到图表区域外时,自定义添加的工具提示会隐藏起来。

代码是这样的。

options: {
  events: ["click", "mouseout"],
....
...

下面是... 链接到我更新的JS Fiddel例子。

© www.soinside.com 2019 - 2024. All rights reserved.