Home  • Programming • JQuery

How to make your own JQuery plugin

1. Introduction Creating a jQuery Plugin is an advanced topic for a jQuery beginner. This<br/>month, I have been playing with jQuery intensively. Though I have learnt how<br/>to separate the javascript code from html document, I ain't satisfy yet.<br/>Whenever I look at my javascript file, it's messy. So, I have decided to go<br/>one step further - learn how to write a jQuery plugin to tidy up the<br/>javascript file. This plugin is based on my previous tutorial - Navigation List menu + jQuery<br/>Animate Effect Tutorial . Last time, I wrote the script and chucked in all<br/>the code in the document.ready section, like this:
$(document).ready(function() {
     
    $('ul#menu li:even').addClass('even');
         
    $('ul#menu li a').mouseover(function() {
         
        $(this).animate( { paddingLeft:"20px" }, { queue:false,<br/>duration:500 });
         
    }).mouseout(function() {
     
        $(this).animate( { paddingLeft:"0" }, { queue:true,<br/>duration:500 });
         
    }).click(function() {
     
        $(this).animate( { fontSize:"20px" }, { queue:false,<br/>duration:500 });
    });
             
});   
But now, I want it to display something like this:
$(document).ready(function() {
     
    $(#menu).animateMenu({
        padding:20
    })
             
});   
It looks much more better, and easier to reuse this script for another<br/>project. 2. Plugin Structure jQuery website has provided a very detailed explanation in Plugins/Authoring<br/>page. However, I found it's hard to understand. Alright, to make your life easier, I did some research online, the following<br/>snippet will be a good structure to write a plugin. //You need an anonymous function to wrap around your function to avoid<br/>conflict
(function($){
 
    //Attach this new method to jQuery
    $.fn.extend({ 
         
        //This is where you write your plugin's name
        pluginname: function() {
 
            //Iterate over the current set of matched elements
            return this.each(function() {
             
                //code to be inserted here
             
            });
        }
    });
     
//pass jQuery to the function, 
//So that we will able to use any valid Javascript variable name 
//to replace "$" SIGN. But, we'll stick to $ (I like dollar<br/>sign: ) )       
})(jQuery);
2. Plugin With Options If you look at step one - Introduction, the "padding" value for<br/>this plugin is user configurable. It good to have some settings so that user<br/>able to chage it according to their own needs. Please make sure you specify<br/>the default values for each of the variables for good practise. Now, you'll<br/>need the following code:
(function($){
 
    $.fn.extend({ 
         
        //pass the options variable to the function
        pluginname: function(options) {
 
 
            //Set the default values, use comma to separate the settings,<br/>example:
            var defaults = {
                padding: 20,
                mouseOverColor : '#000000',
                mouseOutColor : '#ffffff'
            }
                 
            var options =  $.extend(defaults, options);
 
            return this.each(function() {
                var o = options;
                 
                //code to be inserted here
                //you can access the value like this
                alert(o.padding);
             
            });
        }
    });
     
})(jQuery);
 
3. The animateMenu Plugin Now you have learnt the plugin structure. The following is the plugin I<br/>created based on my previous tutorial. I have successfull convert the<br/>standard jQuery script to a plugin that accepts 4 configurations: animatePadding : Set the padding value for the animate effect defaultPadding : Set the default padding value evenColor : Set the color this color if index value is even number oddColor : Set the color this color if index value is odd number
(function($){
    $.fn.extend({ 
        //plugin name - animatemenu
        animateMenu: function(options) {
 
            //Settings list and the default values
            var defaults = {
                animatePadding: 60,
                defaultPadding: 10,
                evenColor: '#ccc',
                oddColor: '#eee'
            };
             
            var options = $.extend(defaults, options);
         
            return this.each(function() {
                var o =options;
                 
                //Assign current element to variable, in this case is UL<br/>element
                var obj = $(this);              
                 
                //Get all LI in the UL
                var items = $("li", obj);
                   
                //Change the color according to odd and even rows
                $("li:even", obj).css('background-color',<br/>o.evenColor);             
                $("li:odd", obj).css('background-color',<br/>o.oddColor);                     
                   
                //Attach mouseover and mouseout event to the LI  
                items.mouseover(function() {
                    $(this).animate({paddingLeft: o.animatePadding}, 300);
                     
                }).mouseout(function() {
                    $(this).animate({paddingLeft: o.defaultPadding}, 300);
                });
                 
            });
        }
    });
})(jQuery);
 
4. Full source code You can save the plugin in a separated file (for example,<br/>jquery.animatemenu.js). In this tutorial, I put the script in the html<br/>document.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0<br/>Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"<br/>lang="en" xml:lang="en">
     
<head>
    <title></title>
    <script type="text/javascript"<br/>src="http://code.jquery.com/jquery-latest.js"></script><br/>
    <script>
 
(function($){
    $.fn.extend({ 
        //plugin name - animatemenu
        animateMenu: function(options) {
 
            var defaults = {
                animatePadding: 60,
                defaultPadding: 10,
                evenColor: '#ccc',
                oddColor: '#eee',
            };
             
            var options = $.extend(defaults, options);
         
            return this.each(function() {
                  var o =options;
                  var obj = $(this);                
                  var items = $("li", obj);
                   
                  $("li:even", obj).css('background-color',<br/>o.evenColor);               
                  $("li:odd", obj).css('background-color',<br/>o.oddColor);                   
                   
                  items.mouseover(function() {
                      $(this).animate({paddingLeft: o.animatePadding},<br/>300);
                     
                  }).mouseout(function() {
                      $(this).animate({paddingLeft: o.defaultPadding},<br/>300);
                     
                  });
            });
        }
    });
})(jQuery);
     
    </script>
     
    <script type="text/javascript">
    $(document).ready(function() {
        $('#menu').animateMenu({animatePadding: 30, defaultPadding:10});
    }); 
    </script>
    <style>
      body {font-family:arial;font-style:bold}
      a {color:#666; text-decoration:none}
        #menu {list-style:none;width:160px;padding-left:10px;}
        #menu li {margin:0;padding:5px;cursor:hand;cursor:pointer}
    </style>
</head>   
<body>
 
<ul id="menu">
    <li>Home</li>
    <li>Posts</li>
    <li>About</li>
    <li>Contact</li>
</ul>
 
</body>
</html>
I hope this tutorial will give you a better understanding. It isn't too<br/>hard at all to create a jQuery plugin. I was reluctantly to learn at first,<br/>but now, I realized how simple it is. I will be publishing another tutorial soon - How to create a simple<br/>Accordion jQuery Plugin. So, stay tuned.

Comments 0


Share

Copyright © 2024. Powered by Intellect Software Ltd