以下のコードを使用して複数のGoogle Chartsを再帰的に作成しようとしています。私はAJAX
を使用してチャートデータを取得し、配列histogramData
に格納しています。Javascriptで複数のGoogle Chartsを再帰的に作成する
このコードでは、複数のi_histogram
グラフを作成できますが、各ループの相互作用時に、前のグラフに最後のグラフが上書きされているようです。
HTMLコード:
<div id="histogramCharts"></div>
Javascriptコード:
var histogramChartElement = document.getElementById('histogramCharts');
// remove histogram chart element children
while (histogramChartElement.hasChildNodes()) {
histogramChartElement.removeChild(histogramChartElement.childNodes[0]);
}
for (var i = 0; i < histogramLabels.length; i++) {
var label = histogramLabels[i];
var node = document.createElement('div');
node.setAttribute('id', i + '_histogram');
histogramChartElement.appendChild(node);
var dataTable = new google.visualization.DataTable();
dataTable.addColumn('string', 'A');
dataTable.addColumn('number', 'B');
dataTable.addRows(histogramData[i]);
google.charts.setOnLoadCallback(function() {
var options = {
title: histogramLabels[i],
legend: {position: 'none'},
histogram: {bucketSize: 0.1}
};
var histogramChart = new google.visualization.Histogram(node);
histogramChart.draw(dataTable, options);
});
}
私はこの結果を得た:
<div id="histogramCharts">
<div id="0_histogram"></div>
<div id="1_histogram"></div>
<div id="2_histogram">
<div style="position: relative;">....</div>
</div>
</div>
ループ内の最後の値だけが適用される理由は、あなたのforループが期待したことをしていないということです。ループのたびにノードのような変数が変更され、グラフを作成している内部関数は内部関数が作成されたときの値ではなく、それらの変数を参照しています。したがって、ノード変数には、各グラフが作成されるまでに最後の値が常に含まれます。これは、JavaScriptを使用する人々が頻繁に抱える問題です。 https://stackoverflow.com/questions/2828718/javascript-scope-problem-when-lambda-function-refers-to-a-variable-in-enclosing – dlaliberte