Làm cách nào để tôi có thể truy cập vào biểu đồ Highcharts thông qua DOM-Container


85

Khi tôi hiển thị biểu đồ highcharts đến vùng chứa div, làm cách nào để có thể truy cập vào đối tượng biểu đồ thông qua vùng chứa div? tôi không muốn biến biểu đồ trở nên toàn cầu.

        var chart = new Highcharts.Chart({
            chart: {
                renderTo: "testDivId",
                                ...

Tôi muốn truy cập biểu đồ bên ngoài ngữ cảnh ở trên như thế này (mã giả), để gọi các hàm:

var chart = Highcharts.Chart("testDivId"); //access from id
chart.redraw();

Câu trả lời:


139

Highcharts 3.0.1

Người dùng có thể sử dụng plugin highcharts

var chart=$("#container").highcharts();

Biểu đồ cao 2.3.4

Đọc từ mảng Highcharts.charts , cho phiên bản 2.3.4 trở lên, chỉ mục của biểu đồ có thể được tìm thấy từ dữ liệu trên<div>

 var index=$("#container").data('highchartsChart');
 var chart=Highcharts.charts[index];

Tất cả các phiên bản

Theo dõi biểu đồ trong một đối tượng / bản đồ toàn cầu theo id vùng chứa

var window.charts={}; 
function foo(){
  new Highcharts.Chart({...},function(chart){  
      window.charts[chart.options.chart.renderTo] = chart;
  });
}

function bar(){
  var chart=window.charts["containerId"];
}

Đọc chế độ @ Highcharts Mẹo - Truy cập đối tượng biểu đồ từ ID vùng chứa

PS

Một số bổ sung đã được thực hiện trong các phiên bản mới hơn của Highcharts kể từ khi viết câu trả lời này và đã được lấy từ các câu trả lời từ @davertron, @Moes và @Przy, vui lòng ủng hộ nhận xét / câu trả lời của họ vì họ xứng đáng được ghi nhận . Thêm chúng ở đây vì câu trả lời được chấp nhận này sẽ không đầy đủ nếu không có những


10
Dường như như các phiên bản 2.3.4 Highcharts không theo dõi tất cả các bảng xếp hạng trên trang: api.highcharts.com/highcharts#Highcharts
davertron

@davertron cảm ơn cho cập nhật ... thats một tính năng thú vị khi có, đừng nghĩ nhiều mã / nỗ lực được yêu cầu phải có điều này ...
Jugal Thakkar

+1 cho $ ("# container"). Data ('highchartsChart') làm chỉ mục highcharts. nó rất hữu ích, cảm ơn!
Shahar

1
Bất kỳ phương pháp tương tự nào tôi có thể sử dụng cho highstock?
tnkh

45

bạn có thể làm được việc này

var chart = $("#testDivId").highcharts();

kiểm tra ví dụ trên fiddler


Nó không hiệu quả với tôi, tôi phải sử dụng câu trả lời @Frzy. Tôi đang sử dụng phiên bản 4.1.4
David Torres

không chắc chắn lý do tại sao nó không làm việc cho bạn ví dụ sử dụng fiddle v4.2.3
Nerdroid

1
Nó đang trả về phần tử vùng chứa thay vì biểu đồ và đó là lý do tại sao câu trả lời @Frzy hoạt động. Ngoài ra, tôi đã tìm thấy một giải pháp khác:$("#testDivId").highcharts({...}, function(chart) {...});
David Torres

nó chắc chắn trả lại đối tượng jsfiddle.net/abbasmhd/86hLvc5s kiểm tra giao diện điều khiển đầu ra sau khi bạn nhấp vào nút
Nerdroid

1
Vâng, trong jsfiddle đang làm điều đó, tôi đồng ý. Nhưng không phải tất cả mọi người đang làm việc cho nhau, như bạn có thể nhìn thấy bằng 11 upvotes của @Frzy câu trả lời
David Torres

22
var $chartCont = $('#container').highcharts({...}),
    chartObj = Highcharts.charts[$chartCont.data('highchartsChart')];

chartCont là Đối tượng jQuery. chartObj là Đối tượng Biểu đồ Highchart.

Điều này đang sử dụng Highcharts 3.01


10

Đơn giản với JS thuần túy:

var obj = document.getElementById('#container')
    Highcharts.charts[obj.getAttribute('data-highcharts-chart')];

9

Tôi đã tìm thấy một cách khác để làm điều đó ... chủ yếu là vì tôi đang sử dụng Highcharts được nhúng trong OutSystems Platform và tôi không có cách nào để kiểm soát cách biểu đồ được tạo.

Cách mà tôi tìm thấy như sau:

  1. Cung cấp một lớp nhận dạng cho biểu đồ bằng cách sử dụng classNamethuộc tính

    chart: {
        className: 'LifeCycleMasterChart'
    }
    
  2. Xác định một chức năng phụ trợ để lấy biểu đồ theo tên lớp

    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;
    

    }

  3. Sử dụng chức năng phụ trợ bất cứ nơi nào bạn cần

    var detailChart = getChartReferenceByClassName('LifeCycleDetailChart');
    

Hy vọng nó sẽ giúp bạn!


5

Không có jQuery (vani js):

let chartDom = document.getElementById("testDivId");
let chart = Highcharts.charts[Highcharts.attr(chartDom, 'data-highcharts-chart')]

4
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 là toàn cục nên bạn có thể sử dụng để truy cập vào đối tượng de highchart không quan trọng dù vùng chứa là

chart1.redraw();

2

... và với sự giúp đỡ của đồng nghiệp ... cách tốt hơn để làm điều đó là ...

getChartReferenceByClassName(className) {
    var foundChart = $('.' + className + '').eq(0).parent().highcharts();

    return foundChart;
}

1

Câu trả lời của @elo là đúng và được ủng hộ , mặc dù tôi phải chỉnh sửa lại một chút để làm rõ ràng hơn:

const myChartEl = document.getElementById('the-id-name');
const myChart = Highcharts.charts[myChartEl.getAttribute('data-highcharts-chart')];

myChartsau đó trở thành một đối tượng Highcharts trực tiếp hiển thị tất cả các đạo cụ hiện tại có trong biểu đồ được hiển thị trong myChartEl. Vì myChartlà một đối tượng Highcharts , người ta có thể chuỗi các phương thức nguyên mẫu ngay sau nó, mở rộng nó hoặc tham chiếu đến nó.

myChart.getTable();
myChart.downloadXLS();
setTimeout(() => Highcharts.fireEvent(myChart, "redraw"), 10);

Người ta cũng có thể myChartvượt qua .highcharts(), đó là một jQueryplugin:

var myChart = $("#the-id-name").highcharts();

Phương pháp tiếp cận jQueryplugin ở trên yêu cầu jQueryphải được tải trước khi sử dụng plugin và tất nhiên là chính plugin đó. Chính sự vắng mặt của plugin này đã khiến tôi phải tìm cách thay thế để hoàn thành điều tương tự với JavaScript vani thuần túy.

Bằng cách sử dụng phương pháp JS thuần túy, tôi đã có thể làm những gì tôi cần (đoạn mã thứ hai) mà không cần phải dựa vàojQuery :

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.