You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			144 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Markdown
		
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Markdown
		
	
## Writing plugins ##
 | 
						|
 | 
						|
All you need to do to make a new plugin is creating an init function
 | 
						|
and a set of options (if needed), stuffing it into an object and
 | 
						|
putting it in the $.plot.plugins array. For example:
 | 
						|
 | 
						|
```js
 | 
						|
function 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's
 | 
						|
a good idea to avoid leaking names. The usual trick here is wrap the
 | 
						|
above lines in an anonymous function which is called immediately, like
 | 
						|
this: (function () { inner code ... })(). To make it even more robust
 | 
						|
in case $ is not bound to jQuery but some other Javascript library, we
 | 
						|
can write it as
 | 
						|
 | 
						|
```js
 | 
						|
(function ($) {
 | 
						|
    // plugin definition
 | 
						|
    // ...
 | 
						|
})(jQuery);
 | 
						|
```
 | 
						|
 | 
						|
There's a complete example below, but you should also check out the
 | 
						|
plugins bundled with Flot.
 | 
						|
 | 
						|
 | 
						|
## Complete example ##
 | 
						|
  
 | 
						|
Here is a simple debug plugin which alerts each of the series in the
 | 
						|
plot. It has a single option that control whether it is enabled and
 | 
						|
how 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 might
 | 
						|
be helpful for other plugins in resolving dependencies.
 | 
						|
  
 | 
						|
Put the above in a file named "jquery.flot.debug.js", include it in an
 | 
						|
HTML 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-specific
 | 
						|
   state between the hooks.
 | 
						|
 | 
						|
The two last points are important because there may be multiple plots
 | 
						|
on 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 on
 | 
						|
top of an existing one.
 | 
						|
 | 
						|
The purpose of the hook is to give you a chance to unbind any event
 | 
						|
handlers you've registered and remove any extra DOM things you've
 | 
						|
inserted.
 | 
						|
 | 
						|
The problem with event handlers is that you can have registered a
 | 
						|
handler which is run in some point in the future, e.g. with
 | 
						|
setTimeout(). Meanwhile, the plot may have been shutdown and removed,
 | 
						|
but because your event handler is still referencing it, it can't be
 | 
						|
garbage collected yet, and worse, if your handler eventually runs, it
 | 
						|
may overwrite stuff on a completely different plot.
 | 
						|
 | 
						|
 
 | 
						|
## Some hints on the options ##
 | 
						|
   
 | 
						|
Plugins should always support appropriate options to enable/disable
 | 
						|
them because the plugin user may have several plots on the same page
 | 
						|
where only one should use the plugin. In most cases it's probably a
 | 
						|
good idea if the plugin is turned off rather than on per default, just
 | 
						|
like most of the powerful features in Flot.
 | 
						|
 | 
						|
If the plugin needs options that are specific to each series, like the
 | 
						|
points or lines options in core Flot, you can put them in "series" in
 | 
						|
the options object, e.g.
 | 
						|
 | 
						|
```js
 | 
						|
var options = {
 | 
						|
    series: {
 | 
						|
        downsample: {
 | 
						|
            algorithm: null,
 | 
						|
            maxpoints: 1000
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
Then they will be copied by Flot into each series, providing default
 | 
						|
values in case none are specified.
 | 
						|
 | 
						|
Think hard and long about naming the options. These names are going to
 | 
						|
be public API, and code is going to depend on them if the plugin is
 | 
						|
successful.
 |