用JQuery写插件时最核心的方法有如下两个$.extend(object) 可以理解为JQuery 添加一个静态方法。$.fn.extend(object) 可以理解为JQuery实例添加一个方法。基本的定义与调用/* $.extend 定义与调用 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ $.extend({ fun1: function () { alert(执行方法一); } }); $.fun1(); /* $.fn.extend 定义与调用 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ $.fn.extend({ fun2: function () { alert(执行方法2); } }); $(this).fun2(); //等同于 $.fn.fun3 function () { alert(执行方法三); } $(this).fun3();知识2:jQuery(function () { }); 与 (function ($) { })(jQuery);的区别jQuery(function () { }); //相当于 $(document).ready(function () { }); /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ (function ($) { })(jQuery); //相当于 var fn function ($) { }; fn(jQuery);jQuery(function () { });是某个DOM元素加载完毕后执行方法里的代码。(function ($) { })(jQuery); 定义了一个匿名函数其中jQuery代表这个匿名函数的实参。通常用在JQuery插件开发中起到了定义插件的私有域的作用。三开发JQuery插件标准结构1定义作用域定义一个JQuery插件首先要把这个插件的代码放在一个不受外界干扰的地方。如果用专业些的话来说就是要为这个插件定义私有作用域。外部的代码不能直接访问插件内部的代码。插件内部的代码不污染全局变量。在一定的作用上解耦了插件与运行环境的依赖。说了这么多那要怎样定义一个插件的私有作用域//step01 定义JQuery的作用域 (function ($) { })(jQuery);别小看了这个作用域就像c#定义一个类的class关键字一样重要。2为JQuery扩展一个插件当定义好了JQuery的作用域后最核心也是最迫切的一步就是为这个JQuery的实例添加一个扩展方法。首先我们为这个Jqury插件命名一个方法叫easySlider当在调用这个插件的时候我们可以通过options来给这个插件传递一些参数。具体的定义方法看如下代码//step01 定义JQuery的作用域 (function ($) { //step02 插件的扩展方法名称 $.fn.easySlider function (options) { } })(jQuery);到现在为止其实一个最简单的JQuery插件就已经完成了。调用的时候可以(#domName).easySlider({})或者(.domName).easySlider({})或者更多的方式来调用这个插件。3设置默认值定义一个JQuery插件就像定义一个.net控件。一个完美的插件应该是有比较灵活的属性。我们来看这段代码asp:TextBox IDTextBox1 Width20 Height100 runatserver/asp:TextBox。 TextBox控件有Width和Height属性用户在用TextBox时可以自由的设置控件的Height和Width也可以不设置值因为控件自身有默认值。那准备开发一个JQuery插件时在用户未指定属性时应该有默认值在JQuery可以分两步实现这样的定义,看如下代码step03-astep03-b。//step01 定义JQuery的作用域 (function ($) { //step03-a 插件的默认值属性 var defaults { prevId: prevBtn, prevText: Previous, nextId: nextBtn, nextText: Next //…… }; //step02 插件的扩展方法名称 $.fn.easySlider function (options) { //step03-b 合并用户自定义属性默认属性 var options $.extend(defaults, options); } })(jQuery);做程序的人都喜欢创新改改变量名呀换一个行呀这些。当看到用var defaults {}来表示一个默认属性时在自己写JQuery插件时就想着与众不同所以用var default01 {} var default02 {}来表示默认属性了。然后默认属性名五花八门越来越糟。所以建议在写JQuery插件时定义默认属性时都用defaults变量来代表默认属性这样的代码更具有可读性。有人看到这行代码var options $.extend(defaults, options)皱起眉头表示不解。那我们先来看如下代码var obj01 { name: 英文名Sam Xiao, age: 29, girlfriend: { name: Yang, age: 29} } var obj02 { name: 中文名XiaoJian, girlfriend: { name: YY} }; var a $.extend(obj01, obj02); var b $.extend(true, obj01, obj02); var c $.extend({}, obj01, obj02); var d $.extend(true,{}, obj01, obj02);把代码拷贝到开发环境中分别看一下a,b,c,d的值就明白了var options $.extend(defaults, options)的含义了。表示 options 去覆盖了defaults的值并把值赋给了options。在插件环境中就表示用户设置的值覆盖了插件的默认值如果用户没有设置默认值的属性还是保留插件的默认值。4支持JQuery选择器JQuery选择器是JQuery的一个优秀特性如果我们的插件写来不支持JQuery选择器确实是一个不小的遗憾。如了使自己的JQuery插件能支持多个选择器我们的代码应该这样定义//step01 定义JQuery的作用域 (function ($) { //step03-a 插件的默认值属性 var defaults { prevId: prevBtn, prevText: Previous, nextId: nextBtn, nextText: Next //…… }; //step02 插件的扩展方法名称 $.fn.easySlider function (options) { //step03-b 合并用户自定义属性默认属性 var options $.extend(defaults, options); //step4 支持JQuery选择器 this.each(function () { }); } })(jQuery);5支持JQuery的链接调用上边的代码看似完美了其实也不那么完美。到目前为止还不支持链接调用。为了能达到链接调用的效果必须要把循环的每个元素return//step01 定义JQuery的作用域 (function ($) { //step03-a 插件的默认值属性 var defaults { prevId: prevBtn, prevText: Previous, nextId: nextBtn, nextText: Next //…… }; //step02 插件的扩展方法名称 $.fn.easySlider function (options) { //step03-b 合并用户自定义属性默认属性 var options $.extend(defaults, options); //step4 支持JQuery选择器 //step5 支持链式调用 return this.each(function () { }); } })(jQuery);这样的定义才能支持链接调用。比如支持这样的调用$(.div).easySlider({prevId:,prevText:}).css({ border-width: 1, border-color: red, border-bottom-style: dotted });6插件里的方法往往实现一个插件的功能需要大量的代码有可能上百行上千行甚至上万行。我们把这代码结构化还得借助function。在第一点已经说了在插件里定义的方法外界不能直接调用我在插件里定义的方法也没有污染外界环境。现在就尝试着怎么样在插件里定义一些方法//step01 定义JQuery的作用域 (function ($) { //step03-a 插件的默认值属性 var defaults { prevId: prevBtn, prevText: Previous, nextId: nextBtn, nextText: Next //…… }; //step06-a 在插件里定义方法 var showLink function (obj) { $(obj).append(function () { return ( $(obj).attr(href) ) }); } //step02 插件的扩展方法名称 $.fn.easySlider function (options) { //step03-b 合并用户自定义属性默认属性 var options $.extend(defaults, options); //step4 支持JQuery选择器 //step5 支持链式调用 return this.each(function () { //step06-b 在插件里定义方法 showLink(this); }); } })(jQuery);