Highcharts-chartをdivコンテナーにレンダリングする場合、div-Containerを介してチャートオブジェクトにアクセスするにはどうすればよいですか?チャート変数をグローバルにしたくありません。
var chart = new Highcharts.Chart({
chart: {
renderTo: "testDivId",
...
関数を呼び出すために、上記のコンテキスト以外のチャート(擬似コード)にアクセスしたい:
var chart = Highcharts.Chart("testDivId"); //access from id
chart.redraw();
ユーザーはhighchartsプラグインを使用できます
var chart=$("#container").highcharts();
Highcharts.charts 配列から読み取り、バージョン2.3.4以降では、<div>
のデータからチャートのインデックスを見つけることができます
var index=$("#container").data('highchartsChart');
var chart=Highcharts.charts[index];
コンテナIDによるグローバルオブジェクト/マップ内のチャートの追跡
var window.charts={};
function foo(){
new Highcharts.Chart({...},function(chart){
window.charts[chart.options.chart.renderTo] = chart;
});
}
function bar(){
var chart=window.charts["containerId"];
}
読み取りモード@ Highchartsのヒント-コンテナーIDからチャートオブジェクトへのアクセス
この回答を書いてからHighchartsの新しいバージョンでいくつかの追加が行われ、@ davertron、@ Moes、および@Przyからの回答から取得されました。 これらについて。この承認済み回答がこれらなしでは不完全であるため、ここに追加します
var $chartCont = $('#container').highcharts({...}),
chartObj = Highcharts.charts[$chartCont.data('highchartsChart')];
chartContはjQueryオブジェクトです。 chartObjはHighchart Chartオブジェクトです。
これはHighcharts 3.01を使用しています
私はそれを行う別の方法を見つけました...主にOutSystems Platformに埋め込まれているHighchartsを使用しているため、チャートの作成方法を制御する方法がありません。
私が見つけた方法は次のとおりでした:
className
属性を使用して、識別クラスをチャートに与えます
chart: {
className: 'LifeCycleMasterChart'
}
クラス名でチャートを取得するための補助関数を定義する
function getChartReferenceByClassName(className) {
var cssClassName = className;
var foundChart = null;
$(Highcharts.charts).each(function(i,chart){
if(chart.container.classList.contains(cssClassName)){
foundChart = chart;
return;
}
});
return foundChart;
}
必要な場所で補助機能を使用する
var detailChart = getChartReferenceByClassName('LifeCycleDetailChart');
それがあなたを助けることを願っています!
純粋なJSの場合:
var obj = document.getElementById('#container')
Highcharts.charts[obj.getAttribute('data-highcharts-chart')];
var chart1; // globally available
$(document).ready(function() {
chart1 = new Highcharts.Chart({
chart: {
renderTo: 'container',
type: 'bar'
},
title: {
text: 'Fruit Consumption'
},
xAxis: {
categories: ['Apples', 'Bananas', 'Oranges']
},
yAxis: {
title: {
text: 'Fruit eaten'
}
},
series: [{
name: 'Jane',
data: [1, 0, 4]
}, {
name: 'John',
data: [5, 7, 3]
}]
});
});
Var chart1はグローバルなので、コンテナであるかどうかに関係なく、ハイチャートオブジェクトにアクセスするために使用できます。
chart1.redraw();
...そして同僚の助けを借りて...それを行うより良い方法は...
getChartReferenceByClassName(className) {
var foundChart = $('.' + className + '').eq(0).parent().highcharts();
return foundChart;
}
JQueryなし(Vanilla js):
let chartDom = document.getElementById("testDivId");
let chart = Highcharts.charts[Highcharts.attr(chartDom, 'data-highcharts-chart')]
@ eloの答えは正解であり、賛成ですが、より明確にするために少し整理する必要がありました。
const myChartEl = document.getElementById('the-id-name');
const myChart = Highcharts.charts[myChartEl.getAttribute('data-highcharts-chart')];
myChart
は、ライブになりますHighchartsmyChartEl
でレンダリングされるチャートに存在する現在のすべての小道具を公開するオブジェクト。 myChart
はHighchartsオブジェクトであるため、その直後にプロトタイプメソッドをチェーン、拡張、または参照できます。
myChart.getTable();
myChart.downloadXLS();
setTimeout(() => Highcharts.fireEvent(myChart, "redraw"), 10);
myChart
プラグインである.highcharts()
を介してjQuery
を取得することもできます。
var myChart = $("#the-id-name").highcharts();
上記のjQuery
pluginアプローチでは、プラグインを使用する前にjQuery
をロードする必要があり、もちろんプラグイン自体もロードします。 このプラグインがなかったため、純粋なバニラJavaScriptで同じことを実現する代替方法を模索するようになりました。
純粋なJSアプローチを使用することで、jQuery
に依存することなく、必要なこと(2番目のコードスニペット)を実行できました: