user1235777
user1235777

Reputation: 639

Google Charts: Problem handling a 'click' event

I have a Google Chart, a bar chart, that I recently extended so that selecting one of the bars will open a new page, showing the data corresponding to that bar. I used the guidelines for basic interactivity, using a selectHandler to process the event.

I then decided to do the same thing when clicking on one of the labels, but I have not been able to get this to work. I looked pretty carefully at the docs, and at this older question (which is, in fact, my actual question: how do I make a hyperlink out of the chart's labels?) for guidance. I added a Listener for click events, and a handler for this, but my chart is not responding to them.

My basic setup is:

google.charts.load('current', {
  callback: drawChart,
  packages: ['bar']
});

var books = [
  ['2018-07', 5, 98.0],
  ['2018-08', 5, 100.0], // etc.
];
function drawChart() {

  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Date');
  data.addColumn('number', 'Number Purchased');
  data.addColumn('number', 'Price Paid');

  data.addRows(books);

  var options = {
    chart: {
      title: 'Book Purchases',
    },
    width: 800,
    height: 800,
    bars: 'horizontal',
    series: {
      0: {
        axis: 'purchased'
      },
      1: {
        axis: 'price_paid'
      }
    },
    axes: {
      x: {
        purchased: {
          side: 'top',
          label: 'Number Purchased'
        },
        price_paid: {
          label: 'Price Paid'
        }
      }
    }
  };

function selectHandler() {
  var selectedItem = chart.getSelection()[0];
  if (selectedItem) {
    var date = data.getValue(selectedItem.row, 0);
    var query_string = '?date=' + date;
    var path = window.location.pathname;
    path = path.replace("bookgraph", "");
    path = path + "search" + query_string;
    var newURL = window.location.protocol + "//" + window.location.host + path;
    window.open(newURL, '_blank');
  }
}

function clickHandler(e) {
  alert('The user has clicked on ' + e.targetID);
}

var chart = new google.charts.Bar(document.getElementById('bookgraph_material'));

google.visualization.events.addListener(chart, 'click', clickHandler);
google.visualization.events.addListener(chart, 'select', selectHandler);
chart.draw(data, options);

The selectHandler works fine. But I can't even get the clickHandler to show the alert (after this works, I'll actually code the rest of it); it's apparently never fired, regardless of where I click. What am I doing wrong?

I set up a JS Fiddle page for this, to experiment with, with an HTML frame so it'll actually work; this shows the working select (albeit to a 404, of course) and the nonworking click.

Thanks.

Upvotes: 1

Views: 3463

Answers (1)

WhiteHat
WhiteHat

Reputation: 61275

the 'click' event is not supported by Material charts,
see issue #: 2257...

and there are several configuration options that are not supported as well,
see issue #: 2143...

Material = google.charts.Bar -- packages: ['bar']

Classic = google.visualization.BarChart -- packages: ['corechart']


one work around would be to use a Classic chart with option --> theme: 'material'

or register your own click event,
see following working snippet...

google.charts.load('current', {
  callback: drawChart,
  packages: ['bar']
});

var books = [
  ['2016-01', 3, 45.0],
  ['2016-02', 3, 56.0],
  ['2016-03', 1, 23.0],
  ['2016-04', 4, 60.0],
  ['2016-05', 1, 0],
  ['2016-06', 3, 14.0],
  ['2016-07', 4, 65.0],
  ['2016-08', 1, 15.0],
  ['2016-09', 13, 234.0],
  ['2016-10', 20, 834.0],
  ['2016-11', 5, 115.0],
  ['2016-12', 5, 58.0],
  ['2017-01', 6, 122.0],
  ['2017-02', 4, 84.0],
  ['2017-03', 1, 0],
  ['2017-04', 1, 30.0],
  ['2017-05', 2, 38.0],
  ['2017-06', 1, 11.0],
  ['2017-07', 0, 0],
  ['2017-08', 4, 88.0],
  ['2017-09', 5, 89.0],
  ['2017-10', 4, 73.0],
  ['2017-11', 5, 79.0],
  ['2017-12', 2, 37.0],
  ['2018-01', 1, 22.0],
  ['2018-02', 5, 98.0],
  ['2018-03', 5, 132.0],
  ['2018-04', 3, 56.0],
  ['2018-05', 14, 272.0],
  ['2018-06', 4, 88.0],
  ['2018-07', 5, 98.0],
  ['2018-08', 5, 100.0],
];

function drawChart() {
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Date');
  data.addColumn('number', 'Number Purchased');
  data.addColumn('number', 'Price Paid');

  data.addRows(books);

  var options = {
    chart: {
      title: 'Book Purchases',
    },
    width: 800,
    height: 800,
    bars: 'horizontal',
    series: {
      0: {
        axis: 'purchased'
      },
      1: {
        axis: 'price_paid'
      }
    },
    axes: {
      x: {
        purchased: {
          side: 'top',
          label: 'Number Purchased'
        },
        price_paid: {
          label: 'Price Paid'
        }
      }
    }
  };

  function selectHandler() {
    var selectedItem = chart.getSelection()[0];
    if (selectedItem) {
      var date = data.getValue(selectedItem.row, 0);
      var query_string = '?date=' + date;
      var path = window.location.pathname;
      path = path.replace("bookgraph", "");
      path = path + "search" + query_string;
      var newURL = window.location.protocol + "//" + window.location.host + path;
      window.open(newURL, '_blank');
    }
  }

  function clickHandler(e) {
    if (e.target.tagName === 'text') {
      console.log(e.target.textContent);
    }
  }

  var container = document.getElementById('bookgraph_material');
  var chart = new google.charts.Bar(container);

  google.visualization.events.addListener(chart, 'select', selectHandler);

  container.addEventListener('click', clickHandler);

  chart.draw(data, options);
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="bookgraph_material"></div>

Upvotes: 2

Related Questions