Jonatas Grosman
Jonatas Grosman

Reputation: 312

Append onload or redraw event functions dynamically in Highcharts

I need to append onload or redraw event functions dynamically in Highcharts, I know make that in config step, like:

$('#container').highcharts({
   chart: {
       events: {
          load: function(event) {
              function1();
              function2();
              function3();
          },
          redraw: function(event) {
              functionA();
              functionB();
              functionC();
          }
       }        
    },
    xAxis: {
    },
    series: [{
        data: [29.9, 71.5]     
    }]
});

But I need do that after config the chart ('cause I don't have access to config chart step, the chart comes to my code by a wrapper) and I need to do something like this:

//The wrapper simulation
^
|
|
/////////////////////////////////////////
//$('#container').highcharts({         //
//    chart: {                         //
//       events: {                     //
//          load: function(event) {    //
//              function1();           //
//          },                         //
//          redraw: function(event) {  //
//              functionA();           //
//          }                          //< "I dont't have access to this code"
//       }                             //  
//    },                               //
//    xAxis: {                         //
//    },                               // 
//    series: [{                       //
//        data: [29.9, 71.5]           //   
//    }]                               // 
//});                                  //
/////////////////////////////////////////

//I only have the container id in my hands, I can get the highchart object:
$('#container').highcharts();

//And I need to do something like this:
appendOnLoadEvent(function2);
appendOnLoadEvent(function3);

appendOnRedrawEvent(functionB);
appendOnRedrawEvent(functionC);

Is this possible?

Upvotes: 6

Views: 11690

Answers (3)

Nilesh Kumar
Nilesh Kumar

Reputation: 315

For Highchart 4.2, you have to use the addEvent method to add event to chart object. Follow the below code, first retrieve highchart object and then add redraw/load event to it

var chart1= Highcharts.charts[0];
Highcharts.addEvent(chart1,'redraw', function(){alert('hi');});

Upvotes: 1

L&#225;szl&#243;
L&#225;szl&#243;

Reputation: 872

The easiest way is to create the events as you described in the first example, and in those functions execute all necesary event handlers from an array.

Something like:

  var redrawCallbacks = [];

  $(...).highcharts({
  chart: {
      events: {
          redraw: function(event) {
              for (var i = 0; i < redrawCallbacks.length; ++i) redrawCallbacks[i].call(this, event);
          }
      }
  }});

See full example at: http://jsfiddle.net/5S6hF/2/

UPDATE
Assuming you are using the default jQuery adapter, you can define events later with:

$(chart).on('redraw', function(){ alert('new event handler'); });

See demo at http://jsfiddle.net/5S6hF/6/

Upvotes: 12

Paweł Fus
Paweł Fus

Reputation: 45079

You need to add callback (like event load), where you can also add redraw events. You need ot do this before creating chart.

See: http://jsfiddle.net/5S6hF/5/

var redrawCallbacks = [];

function appendOnRedrawEvent(callback) {
    redrawCallbacks.push(callback);
}

var loadCallbacks = [];

function appendOnLoadEvent(callback) {
    loadCallbacks.push(callback);
}

appendOnLoadEvent(function () {
    alert('onload added dynamically');
});

H = Highcharts;
H.Chart.prototype.callbacks.push(function (chart) {
    for (var i = 0; i < loadCallbacks.length; ++i) loadCallbacks[i].call(this, event);

    H.addEvent(chart, 'redraw', function (e) {
        for (var i = 0; i < redrawCallbacks.length; ++i) redrawCallbacks[i].call(this, event);
    });
});

//create chart
$('#container').highcharts({
    series: [{
        data: [29.9, 71.5]
    }]
});



appendOnRedrawEvent(function () {
    alert('redraw added later');
});

Upvotes: 0

Related Questions