mirror of
				https://github.com/dawidolko/Website-Templates.git
				synced 2025-10-31 00:13:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			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.
 |