1. 定义作用域

定义一个JQuery插件,首先要把这个插件的代码放在一个不受外界干扰的地方。如果用专业些的话来说就是要为这个插件定义私有作用域。外部的代码不能直接访问插件内部的代码。插件内部的代码不污染全局变量。在一定的作用上解耦了插件与运行环境的依赖。说了这么多,那要怎样定义一个插件的私有作用域?

  1. //step01 定义JQuery的作用域
  2. (function ($) {
  3.  
  4. })(jQuery);

别小看了这个作用域,就像c#定义一个类的class关键字一样重要。

2. 为JQuery扩展一个插件

当定义好了JQuery的作用域后,最核心也是最迫切的一步就是为这个JQuery的实例添加一个扩展方法。首先我们为这个Jqury插件命名一个方法,叫easySlider,当在调用这个插件的时候,我们可以通过options来给这个插件传递一些参数。具体的定义方法看如下代码:

  1. //step01 定义JQuery的作用域
  2. (function ($) {
  3. //step02 插件的扩展方法名称
  4. $.fn.easySlider = function (options) {
  5.  
  6. }
  7. })(jQuery);

到现在为止,其实一个最简单的JQuery插件就已经完成了。调用的时候可以$("#domName").easySlider({})来调用这个插件。

3. 设置默认值

一个完美的插件,应该是有比较灵活的属性。那准备开发一个JQuery插件时,在用户未指定属性时,应该有默认值,在JQuery可以分两步实现这样的定义,看如下代码step03-a,step03-b。

  1. //step01 定义JQuery的作用域
  2. (function ($) {
  3. //step03-a 插件的默认值属性
  4. var defaults = {
  5. prevId: 'prevBtn',
  6. prevText: 'Previous',
  7. nextId: 'nextBtn',
  8. nextText: 'Next'
  9. //……
  10. };
  11. //step02 插件的扩展方法名称
  12. $.fn.easySlider = function (options) {
  13. //step03-b 合并用户自定义属性,默认属性
  14. var options = $.extend(defaults, options);
  15. }
  16. })(jQuery);

做程序的人都喜欢创新,改改变量名呀,换一个行呀这些。当看到用var defaults = {}来表示一个默认属性时,在自己写JQuery插件时就想着与众不同,所以用var default01 ={} ,var default02 ={}来表示默认属性了。然后默认属性名五花八门,越来越糟。所以建议在写JQuery插件时,定义默认属性时,都用defaults变量来代表默认属性,这样的代码更具有可读性。

有人看到这行代码:var options = $.extend(defaults, options),皱起眉头,表示不解。那我们先来看如下代码:

  1. var obj01 = { name: "英文名:Sam Xiao", age: 29, girlfriend: { name: "Yang", age: 29} }
  2. var obj02 = { name: "中文名:XiaoJian", girlfriend: { name: "YY"} };
  3.  
  4. var a = $.extend(obj01, obj02);
  5. var b = $.extend(true, obj01, obj02);
  6. var c = $.extend({}, obj01, obj02);
  7. var d = $.extend(true,{}, obj01, obj02);

把代码拷贝到开发环境中,分别看一下a,b,c,d的值,就明白了var options = $.extend(defaults, options)的含义了。表示 options 去覆盖了defaults的值,并把值赋给了options。

在插件环境中,就表示用户设置的值,覆盖了插件的默认值;如果用户没有设置默认值的属性,还是保留插件的默认值。

4. 支持JQuery选择器

JQuery选择器,是JQuery的一个优秀特性,如果我们的插件写来不支持JQuery选择器,确实是一个不小的遗憾。如何使自己的JQuery插件能支持多个选择器,我们的代码应该这样定义:

  1. //step01 定义JQuery的作用域
  2. (function ($) {
  3. //step03-a 插件的默认值属性
  4. var defaults = {
  5. prevId: 'prevBtn',
  6. prevText: 'Previous',
  7. nextId: 'nextBtn',
  8. nextText: 'Next'
  9. //……
  10. };
  11. //step02 插件的扩展方法名称
  12. $.fn.easySlider = function (options) {
  13. //step03-b 合并用户自定义属性,默认属性
  14. var options = $.extend(defaults, options);
  15. //step4 支持JQuery选择器
  16. this.each(function () {
  17.  
  18. });
  19. }
  20. })(jQuery);

5. 支持JQuery的链接调用

上边的代码看似完美了,其实也不那么完美。到目前为止还不支持链接调用。为了能达到链接调用的效果必须要把循环的每个元素return

  1. //step01 定义JQuery的作用域
  2. (function ($) {
  3. //step03-a 插件的默认值属性
  4. var defaults = {
  5. prevId: 'prevBtn',
  6. prevText: 'Previous',
  7. nextId: 'nextBtn',
  8. nextText: 'Next'
  9. //……
  10. };
  11. //step02 插件的扩展方法名称
  12. $.fn.easySlider = function (options) {
  13. //step03-b 合并用户自定义属性,默认属性
  14. var options = $.extend(defaults, options);
  15. //step4 支持JQuery选择器
  16. //step5 支持链式调用
  17. return this.each(function () {
  18.  
  19. });
  20. }
  21. })(jQuery);

这样的定义才能支持链接调用。比如支持这样的调用:$(".div").easySlider({prevId:"",prevText:""}).css({ "border-width": "1", "border-color": "red", "border-bottom-style": "dotted" });

6. 插件里的方法

往往实现一个插件的功能需要大量的代码,有可能上百行,上千行,甚至上万行。我们把这代码结构化,还得借助function。在第一点已经说了,在插件里定义的方法,外界不能直接调用,我在插件里定义的方法也没有污染外界环境。现在就尝试着怎么样在插件里定义一些方法:

  1. //step01 定义JQuery的作用域
  2. (function ($) {
  3. //step03-a 插件的默认值属性
  4. var defaults = {
  5. prevId: 'prevBtn',
  6. prevText: 'Previous',
  7. nextId: 'nextBtn',
  8. nextText: 'Next'
  9. //……
  10. };
  11. //step06-a 在插件里定义方法
  12. var showLink = function (obj) {
  13. $(obj).append(function () { return "(" + $(obj).attr("href") + ")" });
  14. }
  15.  
  16. //step02 插件的扩展方法名称
  17. $.fn.easySlider = function (options) {
  18. //step03-b 合并用户自定义属性,默认属性
  19. var options = $.extend(defaults, options);
  20. //step4 支持JQuery选择器
  21. //step5 支持链式调用
  22. return this.each(function () {
  23. //step06-b 在插件里定义方法
  24. showLink(this);
  25. });
  26. }
  27. })(jQuery);

步骤step06-a:在插件里定义了一个方法叫showLink(); 这个方法在插件外是不能直接调用的,有点像C#类里的一个私有方法,只能满足插件内部的使用。步骤step06-b演示了怎样调用插件内部的方法。

开发JQuery插件标准结构的更多相关文章

  1. 如何开发jQuery插件

    一:普及JQuery知识 知识1:用JQuery写插件时,最核心的方法有如下两个: $.extend(object) 可以理解为,为JQuery 类添加一个静态方法. $.fn.extend(obje ...

  2. 开发jQuery插件的基本步骤

    在进行开发jQuery插件前,首先要了解一些知识: 1.闭包 1.1.闭包的作用: · 避免全局依赖 · 避免第三方破坏 · 兼容jQuery操作符'$'和jQuery 1.2.闭包的形式 (func ...

  3. 快速开发 jQuery 插件的 10 大技巧(转)

    转自:http://www.oschina.net/news/41776/jquery-10-tips 在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模 ...

  4. 快速开发 jQuery 插件的 10 大技巧

    在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了. ...

  5. 快速开发jQuery插件的10大技巧

    原文链接:http://wiki.itivy.com/?p=36 在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & ...

  6. 教你开发jQuery插件(转)

    教你开发jQuery插件(转) 阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原文: ...

  7. 自己动手开发jQuery插件

    因为工作需要,所以这几天琢磨了一下关于jQuery插件开发的问题,经过一天鏖战,终于完成自己动手做的第一个jQuery插件,对于俺这种见了css就蛋疼菊紧的人来说,一天时间8小时,保守估计有5个小时在 ...

  8. 开发JQuery插件(转)

    教你开发jQuery插件(转)   阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原 ...

  9. 快速开发 jQuery 插件的 10 大技巧(转)

    1. 把你的代码全部放在闭包里面 这是我用的最多的一条.但是有时候在闭包外面的方法会不能调用.不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面.而方法可能应 ...

随机推荐

  1. React 组件传值 父传递儿子

    10===> 传递参数 import React from "react" //一定要导入React // 函数类型去创建组件 export function Web1(pr ...

  2. FormData的介绍(一)

    FormData对象介绍FormData字母意思是表单数据,H5新增的一个内置对象.可以获取任何类型的表单数据,如text radio checkbox file textarea 常用语发送ajax ...

  3. configparser读取配置文件时的相对路径问题

    学习接口测试时,当我把配置文件xx.config和读取配置文件的模块read_config.py放在项目下的同一个包config里时,只需传入文件名xx.config即可实现对配置文件的读取. 但是当 ...

  4. <Math> 29 365

    29. Divide Two Integers class Solution { public int divide(int dividend, int divisor) { if(dividend ...

  5. python持久化对象

    通过shelve模块即可持久化对象 代码 import shelve import numpy as np def writeObj(name,obj): with shelve.open('obje ...

  6. CF785D Anton and School - 2

    题目链接 problem 给出一个括号序列,要求删除一些括号使得剩下的括号序列是个匹配的括号序列,且改括号序列左边全部为左括号,右边全部为右括号. solution 考虑枚举左右括号交界的位置\(x\ ...

  7. python进阶之内存模型

    每一个编程语言的背后都有自己独特的内存模型支持,比如最经典的C语言,一个int类型占8字节.那么在python中不区分数据类型,定义一个变量其在内存在占用多少字节呢?python中数据的运算其内存是如 ...

  8. 【TCP/IP网络编程】:01理解网络编程和套接字

    1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...

  9. ModelAndView重定向带参数解决方法

    业务场景:SpringMVC项目使用ModelAndView进行重定向跳转到另外一个action时,需要在url后面带上参数 如果是带参数带一个页面,直接用modelAndView.addObject ...

  10. Linux vi文档操作

    使用操作 a 在光标后插入    A 插入行末   i 在光标前插入   I 插入行首 o 向下切换一行 O 向上开一行 dd 删除一整行 x 删除光标后一个字符   X 删除光标前一个字符 shif ...