谷歌图表甘特图如何避免工具提示显示?

4

根据一项研究,我发现Gannt Google图表上出现的工具提示无法自定义,因此我决定通过捕获Gannt矩形触发的悬停事件来覆盖它,实现如下:

google.visualization.events.addListener(chart, 'onmouseover', function (e) {
        openTooltip(data, e.row);
    });

但现在的问题是默认的工具提示弹出仍然会打开,我该如何禁用默认的工具提示?(图表选项/自定义jquery)

1个回答

2

在甘特图上,没有选项可以删除默认工具提示

工具提示是使用svg元素绘制的,当您悬停在柱形图上时动态添加
我们可以使用MutationObserver来知道何时添加了工具提示
我们无法删除工具提示,因为这会破坏图表
但我们可以使其不可见/所有元素都透明

请参见以下工作片段...

google.charts.load('current', {
  packages:['gantt']
}).then(function () {
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Task ID');
  data.addColumn('string', 'Task Name');
  data.addColumn('date', 'Start Date');
  data.addColumn('date', 'End Date');
  data.addColumn('number', 'Duration');
  data.addColumn('number', 'Percent Complete');
  data.addColumn('string', 'Dependencies');

  data.addRows([
    ['Research', 'Find sources',
     new Date(2015, 0, 1), new Date(2015, 0, 5), null,  100,  null],
    ['Write', 'Write paper',
     null, new Date(2015, 0, 9), daysToMilliseconds(3), 25, 'Research,Outline'],
    ['Cite', 'Create bibliography',
     null, new Date(2015, 0, 7), daysToMilliseconds(1), 20, 'Research'],
    ['Complete', 'Hand in paper',
     null, new Date(2015, 0, 10), daysToMilliseconds(1), 0, 'Cite,Write'],
    ['Outline', 'Outline paper',
     null, new Date(2015, 0, 6), daysToMilliseconds(1), 100, 'Research']
  ]);

  var options = {
    height: 275
  };

  var container = document.getElementById('chart_div');
  var chart = new google.visualization.Gantt(container);

  google.visualization.events.addOneTimeListener(chart, 'ready', function () {
    var observer = new MutationObserver(function (nodes) {
      Array.prototype.forEach.call(nodes, function(node) {
        if (node.addedNodes.length > 0) {
          Array.prototype.forEach.call(node.addedNodes, function(addedNode) {
            if ((addedNode.tagName === 'rect') && (addedNode.getAttribute('fill') === 'white')) {
              addedNode.setAttribute('fill', 'transparent');
              addedNode.setAttribute('stroke', 'transparent');
              Array.prototype.forEach.call(addedNode.parentNode.getElementsByTagName('text'), function(label) {
                label.setAttribute('fill', 'transparent');
              });
            }
          });
        }
      });
    });
    observer.observe(container, {
      childList: true,
      subtree: true
    });
  });

  chart.draw(data, options);

  function daysToMilliseconds(days) {
    return days * 24 * 60 * 60 * 1000;
  }
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>


1
是的,@WhiteHat,非常有用,我正在使用您的代码直接更改工具提示框内部的文本,使用label.textContent。 - s.demuro
我也可以知道在Array.prototype.forEach.call(addedNode.parentNode.getElementsByTagName('text'), function (label)中将被迭代的文本框数量吗? - s.demuro
addedNode.parentNode.getElementsByTagName('text').length --> addedNode.parentNode.getElementsByTagName('text').length - WhiteHat
这在 React 应用程序上下文中能行吗?我尝试了一下,但好像无法触发 observer - darewreck
它应该可以工作,但是没有看到代码很难帮助你。你在哪里引用观察者?观察者代码实际上可以放置在任何地方,比如文档准备就绪事件中。 - WhiteHat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接