首先我们来搞清楚一些关于Jquery插件的知识:

一、插件的种类:

  • 封装对象方法的插件
    这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件
  • 封装全局函数的插件
    将独立的函数加到jQuery的命名空间之下
  • 选择器插件
    虽然jQuery的选择器已经十分的强大了,但还是会需要扩充一些自己喜欢的选择器

二、插件的基本要点

  • 插件的文件名推荐为 jquery.[插件名].js,例如jquery.color.js
  • 所有的对象方法都应当附加到jQuery.fn对象上,而所有的全局函数都应当附加到jQuery对象本身上
  • 在插件内部,this指向的是当前通过选择器获取的jQuery对象,而不像一般的方法那样,例如click()方法,内部的this指向的是DOM元素
  • 可以通过this.each来遍历所有元素
  • 所有的方法或函数插件,都应当以分号结尾,否则压缩时可能出问题,有的为了更加稳妥些,在插件的开始处加上一个分号
  • 插件应该返回一个jQuery对象,这样可以保证插件的可链式操作。除非插件需要返回的是一些需要获取的量,例如字符串或者数组等
  • 尽量利用闭包技巧历来避免变量名的冲突

三、插件中的闭包
关于闭包:ECMAScript对其进行了简单的描述:允许使用内部函数(即函数定义和函数表达式位于另一个函数的函数体内),而且这些内部函数可以访问他们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数,当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。即内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必须访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。
所以利用闭包的特性,既可以避免内部临时变量影响全局空间,又可以再插件内部继续使用$作为jQuery的别名。最常见的jQuery插件的形式如下:
;(function($){//此处将$作为匿名函数的实参
/*这里放置代码,可以使用$作为jQuery的缩写别名*/
})(jQuery)//这里就将jQuery作为实参传递给匿名函数了

四、编写jQuery插件

  1. 封装jQuery对象方法的插件
  • 编写设置和获取颜色的插件

首先介绍如何编写一个color()插件。此插件用于实现以下两个功能:

(1)设置匹配元素的颜色。

(2)获取匹配的元素(元素集合中的第一个)的颜色

首先按照规范,将此插件命名为jquery.color.js

由于是对jQuery对象的方法扩展,所以采用扩展第一类插件的方法jQuery.fn.extend()来编写,代码如下:

;(function($){
$.fn.extend({
“color”:function(value){
//这里写插件代码
}
});
})(jQuery);

这里给这个方法提供一个参数value,如果调用方法的时候传递了value这个参数,那么就是用这个值来设置字体颜色;否则就是获取匹配元素的字体颜色的值。

首先实现第一个功能,设置字体颜色。只需要简单地调用jQuery提供的css()方法,直接写成this.css(“color”,value)即可。需要注意的是插件内部的this指向的是jQuery对象,而非普通的DOM对象。接下来要注意的是,插件如果不需要返回字符串之类的特定值,应当使其具有可链接性。为此,直接返回这个this对象,由于css()方法也会返回调用它的对象,即此处的this,因此可以将代码写成:


;(function($){
$.fn.extend({
"color":function(value){
return this.css("color",value);
}
});
})(jQuery);

接下来实现第二个功能。如果没有给方法传递参数,那么就是获取集合对象中第一个对象的color的值。由于css()方法本身就具有返回第一个匹配元素的样式值的功能,因此此处无须通过eq()来获取第一个元素。只要将这两个功能结合起来,判断一下value是否是undefined即可。

jQuery代码如下:

;(function($){
   $.fn.extend({
     "color":function(value){
         if (value ==undefined){
            return this.css("color");
         } else {
            return this.css("color",value);
         }
     }
   });
})(jQuery);

此时,color()插件的功能已经全部实现了,通过该插件可以获取和设置元素的color值。实际上,css()方法内部已经有判断value是否为undefined的机制,所以才可以根据传递参数的不同而返回不同的值,因此,可以借助css()方法的这个特性来处理这个问题。删除if()部分,最终剩余的代码实际上与先前的那段一模一样。代码如下:

;(function($){
$.fn.extend({
"color":function(value){
return this.css("color",value);
}
});
})(jQuery);

如何编写一个Jquery插件相关推荐

  1. 实现你人生中的第一个jQuery插件

    前言 本想把本篇取名:从0开始写前端UI框架:实现你人生中的第一个jQuery插件 ,但感觉标题太长,所以简单明了直接取后面主题为题目吧. 前一篇文章 已经对my-ui框架做了简单的介绍.谈到了我是如 ...

  2. 从零开始编写一个vue插件

    title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一 ...

  3. java插件开发_编写一个IDEA插件之:自动生成Java代码

    我很喜欢IDEA的一键自动生成代码功能,例如自动生成构造方法.字段的Get/Set方法.ToString方法等等,除此之外,也有一些插件提供自动生成代码的功能,例如我们所熟悉的GsonFormat插件 ...

  4. 怎么编写一个chrome插件

    怎么编写一个chrome插件 总觉得chrome插件这种东西很高端,很遥不可及.当然复杂的chrome插件开发起来确实比较困难,但是我们可以从一个简单的chrome插件demo慢慢入手,了解一下chr ...

  5. 编写一个VSCode插件

    原文链接: 编写一个VSCode插件 - 愧怍的小站 自从使用过 VSCode 后就再也离不开 VSCode,其轻量的代码编辑器与诸多插件让多数开发者爱不释手.同样我也不例外,一年前的我甚至还特意买本 ...

  6. 编写一个IDEA插件之:事件监听

    事件监听,我们最熟悉不过的就是开发APP时,监听按钮点击事件.手指触摸及移动事件.网络状态事件等等.事件监听大多通过观察者模式实现,首先API调用者不需要知道后台是如何检测出网络状态不可用的,而只需要 ...

  7. 所谓 jQuery 插件,怎样开发一个 jQuery 插件

    简单来说,所谓 jQuery 插件就是扩展在 jQuery 原型对象上的一个方法.通过扩展 jQuery 对象,每次调用 jQuery 对象的时候,对象里面都包含了我们自己所添加的那个方法. 一般插件 ...

  8. 发布一个jQuery插件:formStorage

    中午休息时,没有睡意,没事写了个jquery插件:formStorage. 原理很简单,通过本地存储机制(userData或者localStorage),存储表单中元素的状态到本地. 需要时可以把所存 ...

  9. 如何用vbs编写一个游戏_如何编写一个 SkyWalking 插件

    点击上方"开源社"关注我们 | 作者:vcjmhg| 编辑:李明康| 责编:袁睿斌 | 设计:叶修缘丶 1 概述 之前几篇文章,我们着重介绍了在对 SkyWalking 进行二次开 ...

最新文章

  1. Java学习总结:33(System类)
  2. C++获取当前进程的进程号方法
  3. Entity Framework Unit Testing problem and solution(转)
  4. 解决fragment replace 重叠现象
  5. 汽车位置服务之kafka集群配置注意事项
  6. python 编程效率_五个Python编程Tips,帮你提高编码效率
  7. 安卓 App 库存系统开发 终端设备 SDK 分析
  8. Hi3515主板UBoot参数备份
  9. 牛客JS编程大题(一)
  10. 协同过滤算法_《推荐系统实践》3.基于物品的协同过滤算法
  11. 纯js读取excel文件内容,支持所有刘浏览器
  12. 关于键盘右边的 数字小写键盘不能使用的解决办法
  13. 创建一个ROS工作空间(ROS Workspace)过程中遇到的问题
  14. html怎么设置内存当缓存,前端浏览器缓存怎么使用
  15. 达叔走了,别只发声感叹就完了
  16. Mind思维导图-在线
  17. 音视频编解码流程与如何使用 FFMPEG 命令进行音视频处理
  18. tomcat上部署的solr的移植以及数据的备份与恢复
  19. 人际交往三个常见问题
  20. 正则表达式替换某个字符

热门文章

  1. User.find_each
  2. Delphi 2009 新增的 Class Explorer
  3. const char * 和 char const * 和 char * const 区别
  4. poj-2891(Strange Way to Express Integers)--中国剩余定理扩展欧几里得
  5. NYOJ 170 网络的可靠性
  6. Java 随心笔记10
  7. 微信公众平台开发新手教程(图文具体解释)
  8. HTML5 进阶系列:拖放 API 实现拖放排序
  9. Linux学习笔记 -- 文本编辑器之 vi与vim
  10. canvas象棋 画图