dygraphs plugins ---------------- A single dygraph is actually a collection of dygraphs plugins, each responsible for some portion of the chart: the plot area, the axes, the legend, the labels, etc. This forces the dygraphs code to be more modular and encourages better APIs. The "legend" plugin (plugins/legend.js) can be used as a template for new plugins. Here is a simplified version of it, with comments to explain the plugin lifecycle and APIs: ---------------- // (standard JavaScript library wrapper; prevents polluting global namespace) Dygraph.Plugins.Legend = (function() { // Plugin constructor. This is invoked once for every chart which uses the // plugin. You can't actually access the Dygraph object at this point, so the // initialization you do here shouldn't be chart-specific. (For that, use // the activate() method). var legend = function() { this.div_ = null; }; // Plugins are expected to implement this method for debugging purposes. legend.toString = function() { return "Legend"; }; // This is called once the dygraph is ready. The chart data may not be // available yet, but the options specified in the constructor are. // // Proper tasks to do here include: // - Reading your own options // - DOM manipulation // - Registering event listeners // // "dygraph" is the Dygraph object for which this instance is being activated. // "registerer" allows you to register event listeners. legend.prototype.activate = function(dygraph, registerer) { // Create the legend div and attach it to the chart DOM. this.div_ = document.createElement("div"); dygraph.graphDiv.appendChild(this.div_); // Add event listeners. These will be called whenever points are selected // (i.e. you hover over them) or deselected (i.e. you mouse away from the // chart). This is your only chance to register event listeners! Once this // method returns, the gig is up. registerer.addEventListener('select', legend.select); registerer.addEventListener('deselect', legend.deselect); }; // The functions called by event listeners all take a single parameter, an // event object. This contains properties relevant to the particular event, but // you can always assume that it has: // // 1. A "dygraph" parameter which is a reference to the chart on which the // event took place. // 2. A "stopPropagation" method, which you can call to prevent the event from // being seen by any other plugins after you. This effectively cancels the // event. // 3. A "preventDefault" method, which prevents dygraphs from performing the // default action associated with this event. // legend.select = function(e) { // These are two of the properties specific to the "select" event object: var xValue = e.selectedX; var points = e.selectedPoints; var html = xValue + ':'; for (var i = 0; i < points.length; i++) { var point = points[i]; html += ' ' + point.name + ':' + point.yval; } // In an event listener, "this" refers to your plugin object. this.div_.innerHTML = html; }; // This clears out the legend when the user mouses away from the chart. legend.deselect = function(e) { this.div_.innerHTML = ''; }; return legend; })(); ---------------- Plugin Events Reference: - predraw - clearChart - drawChart - select - deselect TODO(danvk): document all event properties for each event. Special methods: - (constructor) - activate - destroy ---------------- Notes on plugin registration and event cascade ordering/behavior.