1. 插件种类

插件其实就是对现有的方法(或者叫函数)做一个封装,方便重用提高开发效率。

 

jQeury主要有2种类型

 

1)实例对象方法插件

开发能让所有的jquery实例对象都可以调用的方法。也就是说,只要通过$()工厂获得的jquery实例对象,都可以调用我们开发的方法。95%的插件都是这种类型

 

2)全局函数插件

可以将独立的函数添加到jQuery命名空间中了。那么调用的时候就可以使用 $.函数名称() 或者jQuery.函数名称()来调用了。可以理解为静态方法。

 

2. 添加全局函数

我们可以将jquery理解为类,$是这个类的别名。开发全局函数就是开发这个类的静态方法。如:$.get() ,$.post()。添加新的全局函数,实际上就是扩展jQuery“类”本身,给jQuery命名空间上添砖加瓦. 加入新添加的全局函数的名称是sayHello,功能是弹出一个hello的对话框.

2.1增加一个全局函数

1    jQuery.sayHello=function(name){
2     alert("你好,"+name);
3    }
4    调用:
5    $.sayHello('张三'); 6 或者 7 jQuery.sayHello("李四");

2.2增加多个全局函数

使用jQuery提供的全局函数extend来一次加入多个函数

1    jQuery.extend({
2     sayHello:function(name){
3             alert("你好"+name);
4     },
5     sayBye:function(name){ 6 alert("再见"+name); 7 } 8 } 9 )

上面的代码是往jquery命名空间中添加了两个函数sayHello和syBye,调用同上

 

2.3命名空间

前面的方式有可能与jQuery命名空间中的其它函数产生命名冲突的危险,也有可能与其它jQuery插件中定义的方法重名,所以我们可以考虑将我们定义的所有的函数封装到一个对象中去,相当于为我们的函数给了一个命名空间 代码如下:

1    jQuery.wq={
2     sayHello:function(name){
3             alert("你好"+name);
4     },
5     sayBye:function(name){ 6 alert("再见"+name); 7 } 8 }

这种写法可以这样来理解: 首先我们为jQuery添加了一个wq属性,而这个属性本 身是一个对象,后面我们使用JSON来定义了一个对象,这个对象有两个方法。 所以调用就是如下形式: 调用:

1    $.wq.sayHello("王五");
2    jQuery.wq.sayBye("赵六");

注意:即使页面中包含了jQuery文件,也不应该认为简写形式”$”是始终有效的。 因为”$” 只是一个别名而已,其它的库可以重新定义这个”$” .所以在定义插件的时候, 最好使用jQuery来调用方法,或者重新定义”$”

 

3. 为jQuery实例对象创建新方法

对所有的jQuery实例对象中的方法进行扩展。

 

3.1一次定义一个方法

1    jQuery.fn.sayHello=function(){
2     alert("你好!");
3    }
4    调用:
5    $("div").sayHello();

3.2一次定义多个方法

前面一次定义一个方法太少,我们能不能一次多定义一些方法?jQuery库提供了 jQuery.fn.extend方法来一次定义多个方法

1    jQuery.fn.extend({
2     sayHello:function(){
3             alert("Hello");
4     },
5     sayBye:function(){ 6 alert("Bye Bye"); 7 } 8 });

可以看到extend方法的参数实际上就是一个JSON格式的对象。 调用的时候可以如下调用: $(“div”).sayHello() 和 $(“div”).sayBye();

 

4. 插件方法内部的this关键字说明

上面的写法相当于每一个jQuery实例都可以使用,这跟全局函数没有什么区别。而我们定义的实例方法往往是需要在特定的环境中使用的。所以我们在编写插件方法的时候,应该考虑对象方法的环境。“this”关键字在任何插件方法内部引用的都是当前的jQuery实例对象。所以可以在this上调用任何 jQuery方法。需要注意的是:我们使用的jQuery选择符可能会选取多个元素,哪么“当前的jQuery实例”有可能是一个元素,多个元素或者零个元素。我们必须考虑到这种情况。 如果我们使用选择器选中了多个元素,那就可以使用each()方法来迭代每个元素,在each方法内部,再使用this,这个this指的就是每个 HTML DOM 元素的引用。

 

5. 方法连缀 

使用jQuery对象方法的时候,基本都能使用连缀的方式。那么我们使用插件的时候就必须为插件方法返回一个jQuery实例对象。

01    jQuery.fn.extend({
02     sayHello:function(){
03             alert("Hello");
04             return this; 05 }, 06 sayBye:function(){ 07 alert("Bye Bye"); 08 return this; 09 } 10 });

6. 为插件方法定义默认值

通过使用jQuery.extend()方法,可以方便提供随时可能被传入的参数覆盖的默认值,此时对方法的调用会大致保持相同. 注意:jQuery.extend方法在API中的两个地方都有,一个在【核心】.【插件机制】中有,并且只有一个参数。一个在【工具】.【数组和对象操作】中。 注意这里我们使用的是后者,形式为: jQuery.extend(target, object1) 它的作用是将后面对象中所有的属性和方法复制到前面对象中,即将object1中的属性和方法复制到target对象中。 所以我们在定义一个插件的时候,可以使用如下方式为插件方法指定默认值:

1    jQuery.fn.sayHello=function(properties){
2     var defaults={
3             name:"张三",
4             age:20
5 }; 6 jQuery.extend(defaults,properties); 7 alert("第一个参数:"+defaults.name+" 第二个参数"+defaults.age); 8 return this; 9 }

这样一来,我们就可以这样来调用了

01    $("div").sayHello({
02            name:"李四",
03            age:30
04    });
05    或者:
06    $("div").sayHello({
07            name:"王五"
08 }); 09 或者: 10 $("div").sayHello({ 11 age:25 12 });

7. 插件开发技巧-闭包

我们在开发插件的过程中,是将代码写在了一个js文件中,那么这个js文件中有可能会定义很多的方法或者一些变量。那么这些方法或者变量就有可能与别的 js文件中的变量或者方法冲突,那么如何将我们定义的js代码“暴露”一部分,隐藏一部分呢?也就是你虽然定义了,但是在其它地方访问不到,该暴露的暴 露,不该暴露的就藏起来,要达到这个目的,就得用到“闭包“ 那何为“闭包“?说简单点就是允许使用内部函数,即在函数中定义另外一个函数,而且内部函数可以访问在外部函数中声明的变量和其它内部函数。比如有如下定 义:

//定义A函数

1    function A(){
2     //定义B函数
3     var B=function(){ 4 alert("这是B"); 5 } 6 return B; //将B函数返回 7 } 8 var c=A();//此时C就是B函数 9 c();//其实就是调用B函数

可以看到,内部函数B在包含它的A函数之外执行了,这就形成了闭包。也就是B在外部函数A返回之后被执行了,而当B执行的时候它仍然可以访问A中定义的局部变量和其它内部函数。 利用闭包的特性,我们可以将我们需要暴露的方法暴露出来,比如B,又可以隐藏一些局部变量和函数,比如在A中定义变量和函数,A以外的其它函数是不能访问的,但是B是可以访问的。 其实上面的代码就是先执行A函数,得到结果,这个结果又是一个函数,然后再执行B函数即 var c=A(); c(); 既然我们的目的是想让B在A之外执行,那我们可以将代码做如下变通:

1    var C;
2    function A(){
3     var B=function(){ 4 alert("这是B函数"); 5 } 6 C=B;//将内部函数赋值给C 7 }

//让A函数执行,A执行之后就将B赋值给C了A();

//现在执行C,实际上就是B的执行C();

//弹出对话框 "这是B函数" 去掉中间变量c将其改写为 A()(); 这与上面的效果是一样的。

能不能让A在定义之后马上就执行呢?我们可以定义一个匿名函数 放到一对括号中,然后 再用一对小括号执行它即可:

1    var C;
2    (function(){
3     var B=function(){ 4 alert("这是B函数"); 5 } 6 C=B;//将内部函数赋值给C 7 })()

//现在执行C,实际上就是B的执行C(); //弹出对话框 "这是B函数" 能不能从外面传个参数进去交给函数B呢?改写代码如下:

1    (function($){
2     //这里就可以使用$符号了.....
3     //将B函数添加到JQuery的实例对象函数中 4 $.fn.B=function(){ 5 alert("这是B函数"); 6 } 7 })(jQuery);

这段代码被浏览器加载就会被执行,jquery作为参数传递进去交给了 $符号,所以内部就能使用$符号了,在代码中,我们使用$.fn为jQuery的实例对象添加了一个方法B,页面 上使用:

1    $(document).ready(function(){
2            $("h1").B();
3    });

执行结果 所以常见的jQuery插件都是以下这种形式: 好处就在于代码内部定义的方法外部只有插件能够访问,这样就将一些代码隐藏起来了,该 暴露的插件方法暴露在外部了。

1    (function($){
2     //插件代码
3    })(jQuery)

jquery插件分类与编写详细讲解相关推荐

  1. jQuery实现折叠卡片[代码+详细讲解+效果图]

    文章目录 前言 一.html代码及说明 二.css代码及说明 三.js代码及说明 四.完整代码 五.效果图 总结 前言 主要我们来练习jQuery语法,这是我在学习jQuery时写的案例,感觉比较有意 ...

  2. jquery function_前端基础进阶(十三)详细图解jQuery扩展jQuery插件

    UI 鉴赏 早几年学习前端,大家都非常热衷于研究jQuery源码. 我至今还记得当初从jQuery源码中学到一星半点应用技巧的时候常会有一种发自内心的惊叹,"原来JavaScript居然可以 ...

  3. 自己编写jQuery插件之表单验证

    自己编写jQuery插件之表单验证 吐个嘈先:最近状态不咋滴,真是什么都不想干,不想上班,做什么都没动力,觉得没意思.不想这样,不想这样,快让这种情绪消失吧,忽忽.... 表单验证在项目中用的还是比较 ...

  4. 自己动手丰衣足食之征服jQuery插件编写

    原文地址:http://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其 ...

  5. jQuery 使用 jQuery UI 部件工厂编写带状态的插件(翻译)

    首先,我们要创建一个progress bar,它只允许我们简单的设置进度值.正如我们接下来将要看到的,我们需要通过调用 jQuery.widget 及其两个参数来实现这一操作,这两个参数分别是:将要创 ...

  6. 如何编写一个Jquery插件

    首先我们来搞清楚一些关于Jquery插件的知识: 一.插件的种类: 封装对象方法的插件 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进行操作,是最常见的一种插件 封装全局函数的 ...

  7. [置顶]       编写自己的JQUERY插件

    如何编写自己的jquery插件 Jquery的插件主要分为三类: 1.封装对象方法的插件:大部分插件都是封装对象的插件 2.封装全局函数的插件:将独立的函数添加到jquery的命名空间之下.Jquer ...

  8. 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins)

    使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins) 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful ...

  9. 分类图片展示php源码,HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)...

    本文讲述了HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果.分享给大家供大家参考,具体如下: 因为本人是星际争霸系列游戏的忠实拥簇,所以在今天的jQuery教程中,我 ...

最新文章

  1. oracle四大语言_Oracle数据库之四大语言
  2. 大盘点|轻量级人脸检测算法实现,快到没朋友的都在这里了~
  3. 环境变量,include搜索路径,lib库搜索路径
  4. java浏览器实验报告_关于java实验报告模板
  5. 【Android APT】编译时技术 ( ButterKnife 原理分析 )
  6. 最优化基础和机器学习优化
  7. Kubernetes实用技巧
  8. windows 环境 docker踩坑
  9. 【一步到胃解决】Several ports (8005, 8080, 8009) required by Tomcat v9.0 Server at localhost are already
  10. javascript --- Object.assign()浅复制解决方法
  11. 使用磁盘为Linux添加swap
  12. java对象头_什么是Java对象标头
  13. idcsystem源码php_最新PHP宝塔IDC分销系统源码
  14. cleanmymac x激活码免费下载激活及使用教程
  15. diskgenius数据恢复软件,亲测可用!
  16. 混频器的噪声来源与抑制方法
  17. magicbookpro做php开发,近乎完美!荣耀MagicBook Pro优缺点解读
  18. CVPR2022论文速递(2022.4.15)!共16篇!内含2篇Oral!
  19. CF1076C Meme Problem(韦达定理)
  20. 腾讯云的服务器解析域名步骤

热门文章

  1. 计算机网络总结:第四章 网络层
  2. python中itemgetter函数_Python中的sorted函数以及operator.itemgetter函数
  3. 神策学堂“训练营+特训营”,种子学员招募中,来一起出圈呀!
  4. 百田公司:与神策数据携手,筑就爆款游戏背后的 4 个数据砝码
  5. 2019年第十二届全国大学生信息安全实践创新赛线上赛Writeup
  6. 耳鼻喉专科服务机构“仁树医疗”完成数千万元A轮融资...
  7. Netty - 传输
  8. UCOS 操作系统 安装配置环境
  9. BlazeDS 整合 Flex HelloWorld 示例
  10. 4月22日(牛马不对嘴)