Rev 20 | Blame | Compare with Previous | Last modification | View Log | Download
## Writing plugins ##All you need to do to make a new plugin is creating an init functionand a set of options (if needed), stuffing it into an object andputting it in the $.plot.plugins array. For example:```jsfunction myCoolPluginInit(plot) {plot.coolstring = "Hello!";};$.plot.plugins.push({ init: myCoolPluginInit, options: { ... } });// if $.plot is called, it will return a plot object with the// attribute "coolstring"```Now, given that the plugin might run in many different places, it'sa good idea to avoid leaking names. The usual trick here is wrap theabove lines in an anonymous function which is called immediately, likethis: (function () { inner code ... })(). To make it even more robustin case $ is not bound to jQuery but some other Javascript library, wecan write it as```js(function ($) {// plugin definition// ...})(jQuery);```There's a complete example below, but you should also check out theplugins bundled with Flot.## Complete example ##Here is a simple debug plugin which alerts each of the series in theplot. It has a single option that control whether it is enabled andhow much info to output:```js(function ($) {function init(plot) {var debugLevel = 1;function checkDebugEnabled(plot, options) {if (options.debug) {debugLevel = options.debug;plot.hooks.processDatapoints.push(alertSeries);}}function alertSeries(plot, series, datapoints) {var msg = "series " + series.label;if (debugLevel > 1) {msg += " with " + series.data.length + " points";alert(msg);}}plot.hooks.processOptions.push(checkDebugEnabled);}var options = { debug: 0 };$.plot.plugins.push({init: init,options: options,name: "simpledebug",version: "0.1"});})(jQuery);```We also define "name" and "version". It's not used by Flot, but mightbe helpful for other plugins in resolving dependencies.Put the above in a file named "jquery.flot.debug.js", include it in anHTML page and then it can be used with:```js$.plot($("#placeholder"), [...], { debug: 2 });```This simple plugin illustrates a couple of points:- It uses the anonymous function trick to avoid name pollution.- It can be enabled/disabled through an option.- Variables in the init function can be used to store plot-specificstate between the hooks.The two last points are important because there may be multiple plotson the same page, and you'd want to make sure they are not mixed up.## Shutting down a plugin ##Each plot object has a shutdown hook which is run when plot.shutdown()is called. This usually mostly happens in case another plot is made ontop of an existing one.The purpose of the hook is to give you a chance to unbind any eventhandlers you've registered and remove any extra DOM things you'veinserted.The problem with event handlers is that you can have registered ahandler which is run in some point in the future, e.g. withsetTimeout(). Meanwhile, the plot may have been shutdown and removed,but because your event handler is still referencing it, it can't begarbage collected yet, and worse, if your handler eventually runs, itmay overwrite stuff on a completely different plot.## Some hints on the options ##Plugins should always support appropriate options to enable/disablethem because the plugin user may have several plots on the same pagewhere only one should use the plugin. In most cases it's probably agood idea if the plugin is turned off rather than on per default, justlike most of the powerful features in Flot.If the plugin needs options that are specific to each series, like thepoints or lines options in core Flot, you can put them in "series" inthe options object, e.g.```jsvar options = {series: {downsample: {algorithm: null,maxpoints: 1000}}}```Then they will be copied by Flot into each series, providing defaultvalues in case none are specified.Think hard and long about naming the options. These names are going tobe public API, and code is going to depend on them if the plugin issuccessful.