制作一个简洁的jquery插件

原文:http://mp.weixin.qq.com/s?__biz=MzAxMzgwNDU3Mg==&mid=401571467&idx=1&sn=08cb00963e6efd3881d3397903e84752&scene=1&srcid=0125cT8n9FJMI1u2faaQgjcS&from=singlemessage&isappinstalled=0#wechat_redirect


英文原文链接:http://www.queness.com/post/112/a-really-simple-jquery-plugin-tutorial

1,简介

对于jquery初学者来说,制作一个jquery插件还是一个比较高级的话题。最近一个月一致在倒腾jquery。因此学些了怎么把javascript代码从html文件中分离出来,对于现在所写的代码并不满意。因此,我决定去深入了解如何做一个jquery插件来使得javascript文件更加的简洁。

本文中制作的插件是基于我上一次的教程:Navigation List menu + jQuery Animate Effect Tutorial(http://www.queness.com/post/68/navigation-list-menujquery-animate-effect-tutorial)改教程中我把所有的js代码都放到了document.ready回调函数中,就像这样:


但是这一次,代码是这样的:

它看起来简洁多了,而且也容易复用到别的项目当中。

2.插件结构

关于制作jquery插件,jquery官网提供了一份非常详细的说明文档。但是,我觉得它实在是太难理解了。

为了是我们的编程生活更美好一些,简单一些,我在线研究了相关的文档。下买呢的这段代码是一段优雅的jquery插件结构。

    1. //You need an anonymous function to wrap around your function to avoid conflict
    2. 匿名包裹函数,避免了全局变量
    3. (function($){
    4. //Attach this new method to jQuery
    5. $.fn.extend({
    6. //This is where you write your plugin‘s name
    7. // jquery插件名称
    8. pluginname: function() {
    9. //Iterate over the current set of matched elements

// 迭代选择器选中的dom元素

    1. return this.each(function() {
    2. //code to be inserted here

// jquery插件的代码

  1. });
  2. }
  3. });
  4. //pass jQuery to the function,
  5. //So that we will able to use any valid Javascript variable name
  6. //to replace "$" SIGN. But, we‘ll stick to $ (I like dollar sign: ) )
  7. })(jQuery);

3. Plugin With Options

如果你看过了第一部分的简介,padding值是可配置的。让用户根据自己的业务需求传递一些参数给插件是很有必要的。保证每一个变量都有一个默认值是一个良好的编程实践。现在,你需要下面的这段代码:

  1. (function($){
  2. $.fn.extend({
  3. //pass the options variable to the function
  4. pluginname: function(options) {
  5. //Set the default values, use comma to separate the settings, example:
  6. var defaults = {
  7. padding: 20,
  8. mouseOverColor : ‘#000000‘,
  9. mouseOutColor : ‘#ffffff‘
  10. }
  11. var options =  $.extend(defaults, options);
  12. return this.each(function() {
  13. var o = options;
  14. //code to be inserted here
  15. //you can access the value like this
  16. alert(o.padding);
  17. });
  18. }
  19. });
  20. })(jQuery);

4. The animateMenu Plugin

现在您已经知道了jquery插件的基本结构。接下来的这个插件就是基于我之前的一个教程。它接收4个参数:

  • 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 numbe
  1. (function($){
  2. $.fn.extend({
  3. //plugin name - animatemenu
  4. animateMenu: function(options) {
  5. //Settings list and the default values
  6. var defaults = {
  7. animatePadding: 60,
  8. defaultPadding: 10,
  9. evenColor: ‘#ccc‘,
  10. oddColor: ‘#eee‘
  11. };
  12. var options = $.extend(defaults, options);
  13. return this.each(function() {
  14. var o =options;
  15. //Assign current element to variable, in this case is UL element
  16. var obj = $(this);
  17. //Get all LI in the UL
  18. var items = $("li", obj);
  19. //Change the color according to odd and even rows
  20. $("li:even", obj).css(‘background-color‘, o.evenColor);
  21. $("li:odd", obj).css(‘background-color‘, o.oddColor);
  22. //Attach mouseover and mouseout event to the LI
  23. items.mouseover(function() {
  24. $(this).animate({paddingLeft: o.animatePadding}, 300);
  25. }).mouseout(function() {
  26. $(this).animate({paddingLeft: o.defaultPadding}, 300);
  27. });
  28. });
  29. }
  30. });
  31. })(jQuery);

译者注:对于web前端从业者来说,使用jquery插件自然可以提升我们的开发效率。但是我们不仅是要知其然也要知其所以然。不仅要做到会使用,也要知道其实现原理。一方面看一些业内优秀的jquery插件的源代码可以有效的提升我们的编码能力;另一方面,掌握了编写jquery插件的方法,可以把我们项目中常用的组件通过这种方式写成jquery插件,便于代码的复用,使代码更加的简洁和可维护。译者也是一个前端小沫沫,从业时间也不长,文中如果有不对的地方,还望指出,不胜感激。

注:感兴趣的可以关注笔者微信公众号,每周推送一篇前端干货

时间: 2024-10-07 05:50:04

制作一个简洁的jquery插件的相关文章

图片延迟加载并等比缩放,一个简单的JQuery插件

使用方法: $(".viewArea img").zoom({height:74,width:103}); (function($){    $.fn.zoom = function(settings){                //一些默认配置:                settings = $.extend({                    height:0,                    width:0,                    load

编写一个简单的Jquery插件

1.实现内容 定义一个简单的jquery插件,alert传递进来的参数 2.插件js文件(jquery.showplugin.js) (function ($) { //定义插件中的方法 var methods = { //Object showName: function (name) { alert('Name:' + name); }, showAge: function (age) { alert('Age' + age); } }; //method方法名 $.fn.showplugi

推荐一个内容滚动jquery插件

myslider是一个内容滚动jquery插件,版本0.1.2的每次滚动内容是一行内容,可以是文字,可以是一个链接,还可以是图片. 官方网址:http://keleyi.com/jq/myslider/ 参考:http://plugins.jquery.com/myslider/ 例子代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>myslider</title><base target=&

一个简单的jQuery插件ajaxfileupload实现ajax上传文件例子

页面代码:   <html>     <!-- 引入相关的js文件,相对路径  -->     <script type="text/javascript" src="js/jquery.js"></script>       <script type="text/javascript" src="js/ajaxfileupload.js"></script&g

使用 Swift 制作一个新闻通知中心插件(1)

input[type="date"].form-control,.input-group-sm>input[type="date"].input-group-addon,.input-group-sm>.input-group-btn>input[type="date"].btn,input[type="time"].input-sm,.form-horizontal .form-group-sm input

写了一个简单的jquery插件(初恋啊)

用了好久的jquery了,却没有写过插件,今天研究了一个别人的插件和一些文章,总算搞清楚了jquery插件一些写法, 代码写了一个div当鼠标事件发生时的宽高变化情况,基础,代码基础,基础好了,才能研究深入的东西. 1 (function(jQuery){ 2 /* 3 * 插件应该返回一个JQuery对象,以便保证插件的可链式操作. 4 * JQuery插件的机制:jQuery提供了2个用于扩展jQuery功能的方法 5 * jQuery.fn.extend() 6 * jQuery.exte

How to Create a Basic Plugin 如何写一个基础的jQuery插件

How to Create a Basic Plugin Sometimes you want to make a piece of functionality available throughout your code. For example, perhaps you want a single method you can call on a jQuery selection that performs a series of operations on the selection. I

使用 Swift 制作一个新闻通知中心插件(2)

我们在第一部分的文章中详细讲解了创建一个通知中心插件的整体过程.我们成功的在通知中心里面显示了新闻列表.但是截止到目前,我们还不能从通知中心的列表中查看新闻的详细内容.在这次的教程中,我们就以上次的教程为基础,继续将我们的通知中心插件的功能改进完善.如果您没有看过第一部分的教程,就请先参看教程的 第一部分. 新闻阅读界面 我们在上一篇教程中,已经完成了通知中心插件的新闻列表显示,但是我们点击这个新闻列表中的新闻条目,是没有任何反应的.所以我们在这里需要一个详细页面来显示这个新闻列表. 回到我们的

一个不错的jquery插件模版

pageplugin.js (function ($) { $.PagePlugin = function (obj, opt) { var options = $.extend({}, $.PagePlugin.defaults), docOffset, _ua = navigator.userAgent.toLowerCase(), is_msie = /msie/.test(_ua), ie6mode = /msie [1-6]\./.test(_ua); if (typeof (obj)