イベント ハンドラーから特定のグラフを取得する方法はないため、別の方法を使用してグラフをハンドラーに渡す必要があります。これを行う方法の 1 つを次に示します。
function selectHandler(myChart) {
// test to see if anything was selected before you get the index
// otherwise you will get errors when the selection contains 0 elements
var selection = myChart.getSelection();
if (selection.length) {
var bar_index = selection[0].row;
// do something with bar_index
// you should also test bar_index, as the user could have clicked a legend item, which would give a null value for row
}
}
chart[chart_index] = new google.visualization.BarChart(document.getElementById('chart_div<%= qcount %>'));
// generally speaking, you should add event handlers before drawing the chart
google.visualization.events.addListener(chart[chart_index], 'select', (function (x) {
return function () {
selectHandler(chart[x]);
}
})(chart_index));
chart[chart_index].draw(data, {width: 450, height: 300, title: 'title'});
chart_index = chart_index+1;
このクロージャはクロージャchart_index
の内部に渡され、それを次のように割り当てますx
:
(function (x) {
return function () {
selectHandler(chart[x]);
}
})(chart_index)
したがって、x
chart_index を後でインクリメントしても、値はクロージャー内でロックされます。クロージャーは、イベント ハンドラーになる関数を返します。この関数は を呼び出し、誰かがグラフ要素をクリックするselectHandler
と を渡します。chart[x]
これをループで繰り返している場合、 の値はx
各クロージャ内で一意になり、関数で特定のチャートを参照できるようになりますselectHandler
。