Fork me on GitHub

JQuery插件开发简述

jQuery优秀的插件不计其数,个人还是看好JQ对DOM完善的操作性。

先了解几个概念

把代码放在闭包中

(function ($) {
    $.fn.extned({
     //code here  
    });
})(jQuery);
上述代码等价于
var justFun = function ($) {
    $.fn.extned({//Code here
    });
}
justFun(jQuery);
为什么要这样,说的官方一点避免全局依赖,避免第三方库的兼容,兼容jQuery与$ 总之好处多多(一般还会在前面加‘;’,体现压缩代码需要遵循规则)。

为插件提供默认选项

可以通过jQuery的extend功能来设置这些选项,具体猛击这里:JQuery.extend()与JQuery.fn.extend()
var defaults = {
    Text: "this is my first JqPlug.",
    Color: "red"
}; 
var setting = $.extend({}, defaults, options);

遵循链式操作

$.fn.Tabs = function (options) {
    return this.each(function () {
        $(this).xxx; //code here
    })
}
这样我们的插件将会支持链式操作

把一次性的代码放在循环体外

如插件的配置参数
var defaults = { Text: "this is my JQPlug",
    Color: "red"
};
$.fn.textHover = function (options) {
    var setting = $.extend({}, defaults, options); //code here
}
简单的说如果有一段代码是一堆默认值,只需要被实例化一次,而不是每次调用你插件功能的时候都实例化,你应该把这段代码放在插件方法的外面。
这样可以让你的插件运行的更高效,节省内存。

管理好 prototype(原型与面向对象)

function Person(options){ 
    this.name=”Irving”,
    this.age=”22”,
    this.photo=null
 }
 Person.prototype={
 generate:function(){  
    //code here
  } }
这样有什么好处呢,保证数据是每一个实例自己的,可以用this来引用,避免重复代码,节省内存,好吧 总之各种好处。

闭包传递正确的this引用(js中的闭包还是要理解一下的)

可以声明变量来保存 var $this =this;这个要看具体应用,高级话题,我也不太深入 哈哈哈!

插件的种类

ok,继续说几点概念,开发JQ插件有几种方式呢!

封装全局函数($.ajax等方法) 封装对象方法(如$('xx').appendto等方法) 选择器插件(自定义自己的选择器 如$('girlfind bf guy:money(1000000…)'))

一般情况下选择器插件可以是不必要的,原因不解释,但特殊情况下还是蛮有用的,如做一个隔行变色的插件,后面将会介绍,当然其他方式也可以实现。
jQuery插件的机制就是利用jQuery提供的jQuery.fn.extend()和jQuery.extend()方法来扩展jQuery的功能。
扩展全局函数插件
; function ($) {
    $.extend({
        getSize: function () { },
        getPage: function () { } //……
    });
} (jQuery)
或者简写
jQuery.getSize=function(){}; jQuery.getPage=function(){};
备注:上述的写法当然可以加上命名空间
jQuery.myNameSpace = {
    getSize: function () { },
    getPage: function () { }
};
调用jQuery.getSize();或$.getPage();
优点就是方便,缺点就是破坏JQ本身的贞操,具体什么时候用看最后摘抄的2条,这能为我们扩展什么功能呢,如取出字符串中的空字符串,序列化对象数据,数据验证,数值的操作等等。
扩展对象方法插件
要扩展对象方法就需要在$.fn.extend({});上扩展我们的插件,如扩展一个能使元素淡出的动画(只是为了示例),我们命名为jquery.myFadeOutPlugin.js
; (function ($) {
    $.fn.extend({ "myFadeOutPlugin": function (value) { return this.fadeOut("5000"); } });
})(jQuery);
或者简写
; (function ($) {
    $.fn.myFadeOutPlugin = function () { return this.fadeOut("5000"); };
})(jQuery);
备注:如果需要多个方法
;(function($){$.fn.extend({
       "myFadeOutPlugin":function(){        
           return this.fadeOut("5000");        
         },       
        "myFadeInPlugin":function(){} //and so on    
       });
})(jQuery);
调用(注意这里的return为了链式)
$('#XX').myFadeOutPlugin();
这里只有一个元素(没有元素的遍历)并没有提供任何默认参数
如果有多个元素呢,OK ,so easy!
(function ($) {
    $.fn.myFadeOutPlugin = function () { return this.each(function () { $(this).fadeOut("5000"); }); };
})(jQuery);
要提供默认参数呢如 渐变的时间,ok,改造如下
(function ($) {
    var defaults = { time: 5000 }; $.fn.myFadeOutPlugin = function (options) { options = $.extend({}, defaults, options); return this.each(function () { $(this).fadeOut(options.time); }); };
})(jQuery);
调用:
$('.div').myFadeOutPlugin({time:1000});//当然也可以使用缺省值
一般开发插件都是基于对象方法的插件,尽量保持JQAPI不变动,具体神马功能自己挖掘吧!
OK,最后给一个模板方便自己
选择器插件

I’am wroking on my way,waiting! 表格渐变插件介绍一个Ajax插件与反射的案例

附一个模板
/*
* @Extends jquery.1.7.2
* @Overview 搜索提示框
* @Author Irving
* @Email  * @version 0.xx
* @Date xxxx年1月4日1:11:33
* @Copyright (c) xxxx Irving
*/
(function ($) {
    var defaults = { xxx: xxx }; //params
     $.fn.yourPlugName = function(options){   
       options = $.extend(defaults, options);     
           this.each(function(){               
                   //code here
               });     
        };
})(jQuery);
 摘抄一段话
jQuery插件的文件名推荐命名为jquery.[插件名].js,以免和其他JS库插件混淆。
所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身。        可以通过this.each 来遍历所有的元素      在插件头部加上一个分号,以免他人的不规范代码给插件带来影响。
所有的方法或函数插件,都应当以分号结尾,以免压缩时出现问题
除非插件需要返回的是一些需要获取的变量,插件应该返回一个jQuery对象,以保证插件的可链式操作。
利于jQuery.extend()方法设置插件方法的默认参数,增加插件的可用性。          在插件内部,this指向的是当前通过选择器获取的JQuery对象,而不像一般方法那样,内部的this指向的是DOM元素。
网络上说开发插件是多用data(.data()方法允许我们在DOM元素上附加任意类型的数据,避免了循环引用的内存泄漏风险),绑定事件用Bind(xxx,function(){});不过我还没领悟其中的奥秘。要想写出优秀的插件,需要对原生js理论有一定的功底,JQ api的熟练,看大牛们写的插件源码,Good luck!
posted @ 2013-01-04 09:36  花儿笑弯了腰  阅读(398)  评论(0编辑  收藏  举报