首页 文章

在Google图表中添加指向自定义工具提示的超链接

提问于
浏览
1

使用这个workaround,我能够在选择谷歌时间线图表时模拟显示工具提示 . 这个问题是我计划在工具提示中链接一个邮件供用户点击 . 但是,在我的函数_1156935中,工具提示已创建,但我无法单击联系人链接 . 这样做的正确方法是什么?

编辑:我也试过Google's tooltip actions但时间线图表不支持 .

google.setOnLoadCallback(drawVisualization);

function drawVisualization() {
  var container = document.getElementById('timeline');
  var chart = new google.visualization.Timeline(container);
  var dataTable = new google.visualization.DataTable();

  dataTable.addColumn({
    type: 'string',
    id: 'President'
  });
  dataTable.addColumn({ type: 'string', id: 'Name' });
  dataTable.addColumn({ type: 'string', role: 'tooltip', 'p': {'html': true}});
  dataTable.addColumn({
    type: 'date',
    id: 'Start'
  });
  dataTable.addColumn({
    type: 'date',
    id: 'End'
  });
  dataTable.addRows([
    ['Washington', 'test', createToolTip(), new Date(1789, 3, 30), new Date(1797, 2, 4)],
    ['Adams', 'test', createToolTip(), new Date(1797, 2, 4), new Date(1801, 2, 4)],
    ['Jefferson', 'test', createToolTip(), new Date(1801, 2, 4), new Date(1809, 2, 4)]
  ]);
  //select-handler
  google.visualization.events.addListener(chart, 'select', function(e) {
    //the built-in tooltip
    var tooltip = document.querySelector('.google-visualization-tooltip:not([clone])');
    //remove previous clone when there is any
    if (chart.ttclone) {
      chart.ttclone.parentNode.removeChild(chart.ttclone)
    }
    //create a clone of the built-in tooltip
    chart.ttclone = tooltip.cloneNode(true);
    //create a custom attribute to be able to distinguish
    //built-in tooltip and clone
    chart.ttclone.setAttribute('clone', true);
    //inject clone into document
    tooltip.parentNode.insertBefore(chart.ttclone, chart.tooltip);
  });

  chart.draw(dataTable, {tooltip: {isHtml: true }});
}

function createToolTip() {
       var mainDiv = '<div >';
       var list =
            '<ul class="google-visualization-tooltip-action-list">' +
                '<li class="google-visualization-tooltip-action">' +
                    '<span style="font-family: Arial; font-size: 12px; color: rgb(0, 0, 0); margin: 0px; text-decoration: none; font-weight: bold;">' +
                        '<a href="mailto:test@test.com?Subject=test">Contact</a>' +
                    '</span>' +
                '</li>' +
            '</ul>';
       var endMainDiv = '</div>';
       var tooltip = mainDiv + list + endMainDiv;
       return tooltip;
    }
.google-visualization-tooltip {
  opacity: 0 !important;
  max-width: 200px !important;
}
.google-visualization-tooltip[clone] {
  opacity: 1 !important;
}
html,
body,
timeline {
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1.1','packages':['timeline']}]}"></script>
<div id='timeline' style="height:90%"></div>

1 回答

  • 1

    看起来像pointer-events默认设置为 'none'

    在将克隆注入dom之前更改为 'auto'

    //inject clone into document
    chart.ttclone.style.pointerEvents = 'auto';
    tooltip.parentNode.insertBefore(chart.ttclone, chart.tooltip);
    

    请参阅以下工作代码段...

    google.charts.load('current', {
      callback: function () {
        var container = document.getElementById('timeline');
        var chart = new google.visualization.Timeline(container);
        var dataTable = new google.visualization.DataTable();
    
        dataTable.addColumn({
          type: 'string',
          id: 'President'
        });
        dataTable.addColumn({ type: 'string', id: 'Name' });
        dataTable.addColumn({ type: 'string', role: 'tooltip', 'p': {'html': true}});
        dataTable.addColumn({
          type: 'date',
          id: 'Start'
        });
        dataTable.addColumn({
          type: 'date',
          id: 'End'
        });
        dataTable.addRows([
          ['Washington', 'test', createToolTip(), new Date(1789, 3, 30), new Date(1797, 2, 4)],
          ['Adams', 'test', createToolTip(), new Date(1797, 2, 4), new Date(1801, 2, 4)],
          ['Jefferson', 'test', createToolTip(), new Date(1801, 2, 4), new Date(1809, 2, 4)]
        ]);
        //select-handler
        google.visualization.events.addListener(chart, 'select', function(e) {
          //the built-in tooltip
          var tooltip = document.querySelector('.google-visualization-tooltip:not([clone])');
          //remove previous clone when there is any
          if (chart.ttclone) {
            chart.ttclone.parentNode.removeChild(chart.ttclone)
          }
          //create a clone of the built-in tooltip
          chart.ttclone = tooltip.cloneNode(true);
          //create a custom attribute to be able to distinguish
          //built-in tooltip and clone
          chart.ttclone.setAttribute('clone', true);
          //inject clone into document
          chart.ttclone.style.pointerEvents = 'auto';
          tooltip.parentNode.insertBefore(chart.ttclone, chart.tooltip);
        });
    
        function createToolTip() {
           var mainDiv = '<div style="z-index: 1000;">';
           var list =
                '<ul class="google-visualization-tooltip-action-list">' +
                    '<li class="google-visualization-tooltip-action">' +
                        '<span style="font-family: Arial; font-size: 12px; color: rgb(0, 0, 0); margin: 0px; text-decoration: none; font-weight: bold;">' +
                            '<a href="mailto:test@test.com?Subject=test">Contact</a>' +
                        '</span>' +
                    '</li>' +
                '</ul>';
           var endMainDiv = '</div>';
           var tooltip = mainDiv + list + endMainDiv;
           return tooltip;
        }
    
        chart.draw(dataTable, {tooltip: {isHtml: true }});
      },
      packages: ['timeline']
    });
    
    .google-visualization-tooltip {
      opacity: 0 !important;
      max-width: 200px !important;
    }
    .google-visualization-tooltip[clone] {
      opacity: 1 !important;
    }
    html,
    body,
    timeline {
      width: 100%;
      height: 100%;
      margin: 0;
      padding: 0;
    }
    
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <div id="timeline" style="height:90%"></div>
    

相关问题