jQuery插件开发全解析

http://www.iteye.com/topic/545971 

jQuery插件的开发包括两种:

一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法。jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法。下面就两种函数的开发做详细的说明。

1、类级别的插件开发

类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法。典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中。关于类级别的插件开发可以采用如下几种形式进行扩展:

1.1 添加一个新的全局函数

添加一个全局函数,我们只需如下定义:

Java代码  收藏代码
  1. jQuery.foo = function() {   
  2. alert('This is a test. This is only a test.');  
  3. };    

 

 

1.2 增加多个全局函数

添加多个全局函数,可采用如下定义:

Java代码  收藏代码
  1. jQuery.foo = function() {   
  2. alert('This is a test. This is only a test.');  
  3. };  
  4. jQuery.bar = function(param) {   
  5. alert('This function takes a parameter, which is "' + param + '".');  
  6. };   
  7. 调用时和一个函数的一样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar');  

1.3 使用jQuery.extend(object); 

Java代码  收藏代码
  1. jQuery.extend({      
  2. foo: function() {      
  3. alert('This is a test. This is only a test.');      
  4. },      
  5. bar: function(param) {      
  6. alert('This function takes a parameter, which is "' + param +'".');      
  7. }     
  8. });  

 

1.4 使用命名空间

虽然在jQuery命名空间中,我们禁止使用了大量的javaScript函数名和变量名。但是仍然不可避免某些函数或变量名将于其他jQuery插件冲突,因此我们习惯将一些方法封装到另一个自定义的命名空间。

Java代码  收藏代码
  1. jQuery.myPlugin = {          
  2. foo:function() {          
  3. alert('This is a test. This is only a test.');          
  4. },          
  5. bar:function(param) {          
  6. alert('This function takes a parameter, which is "' + param + '".');    
  7. }         
  8. };  
  9. 采用命名空间的函数仍然是全局函数,调用时采用的方法:  
  10. $.myPlugin.foo();         
  11. $.myPlugin.bar('baz');  

 

通过这个技巧(使用独立的插件名),我们可以避免命名空间内函数的冲突。

2、对象级别的插件开发

对象级别的插件开发需要如下的两种形式:、

形式1:  

Java代码  收藏代码
  1. (function($){     
  2. $.fn.extend({     
  3. pluginName:function(opt,callback){     
  4.           // Our plugin implementation code goes here.       
  5. }     
  6. })     
  7. })(jQuery);     

形式2

Java代码  收藏代码
  1. (function($) {       
  2. $.fn.pluginName = function() {     
  3.      // Our plugin implementation code goes here.     
  4. };     
  5. })(jQuery);      
       上面定义了一个jQuery函数,形参是$,函数定义完成之后,jQuery这个实参传递进去.立即调用执行。这样的好处是,我们在写jQuery插件时,也可以使用$这个别名,而不会与prototype引起冲突.

2.1 JQuery名称空间下申明一个名字

这是一个单一插件的脚本。如果你的脚本中包含多个插件,或者互逆的插件(例如: $.fn.doSomething() $.fn.undoSomething()),那么你需要声明多个函数名字。但是,通常当我们编写一个插件时,力求仅使用一个名字来包含它的所有内容。我们的示例插件命名为“highlight    

 

Java代码  收藏代码
  1. $.fn.hilight = function() {    
  2.   // Our plugin implementation code goes here.    
  3. };    
  4. 我们的插件通过这样被调用:  
  5. $('#myDiv').hilight();     

 

但是如果我们需要分解我们的实现代码为多个函数该怎么办?有很多原因:设计上的需要;这样做更容易或更易读的实现;而且这样更符合面向对象。 这真是一个麻烦事,把功能实现分解成多个函数而不增加多余的命名空间。出于认识到和利用函数是javascript中最基本的类对象,我们可以这样做。就像其他对象一样,函数可以被指定为属性。因此我们已经声明“hilight”jQuery的属性对象,任何其他的属性或者函数我们需要暴露出来的,都可以在"hilight" 函数中被声明属性。稍后继续。
2.2 
接受options参数以控制插件的行为

让我们为我们的插件添加功能指定前景色和背景色的功能。我们也许会让选项像一个options对象传递给插件函数。例如:   

Java代码  收藏代码
  1. // plugin definition    
  2. $.fn.hilight = function(options) {    
  3.   var defaults = {    
  4.     foreground: 'red',    
  5.     background: 'yellow'    
  6.   };    
  7.   // Extend our default options with those provided.    
  8.   var opts = $.extend(defaults, options);    
  9.   // Our plugin implementation code goes here.    
  10. };    
  11. 我们的插件可以这样被调用:  
  12. $('#myDiv').hilight({    
  13.   foreground: 'blue'    
  14. });     

 

2.3 暴露插件的默认设置

我们应该对上面代码的一种改进是暴露插件的默认设置。这对于让插件的使用者更容易用较少的代码覆盖和修改插件。接下来我们开始利用函数对象。     

 

Java代码  收藏代码
  1. // plugin definition    
  2. $.fn.hilight = function(options) {    
  3.   // Extend our default options with those provided.    
  4.   // Note that the first arg to extend is an empty object -    
  5.   // this is to keep from overriding our "defaults" object.    
  6.   var opts = $.extend({}, $.fn.hilight.defaults, options);    
  7.   // Our plugin implementation code goes here.    
  8. };    
  9. // plugin defaults - added as a property on our plugin function    
  10. $.fn.hilight.defaults = {    
  11.   foreground: 'red',    
  12.   background: 'yellow'    
  13. };     
  14. 现在使用者可以包含像这样的一行在他们的脚本里:  
  15. //这个只需要调用一次,且不一定要在ready块中调用  
  16. $.fn.hilight.defaults.foreground = 'blue';    
  17. 接下来我们可以像这样使用插件的方法,结果它设置蓝色的前景色:  
  18. $('#myDiv').hilight();   

 

如你所见,我们允许使用者写一行代码在插件的默认前景色。而且使用者仍然在需要的时候可以有选择的覆盖这些新的默认值:

// 覆盖插件缺省的背景颜色 

$.fn.hilight.defaults.foreground = 'blue'; 

// ... 

// 使用一个新的缺省设置调用插件 

$('.hilightDiv').hilight(); 

// ... 

// 通过传递配置参数给插件方法来覆盖缺省设置 

$('#green').hilight({ 

  foreground: 'green' 

});  

2.4 适当的暴露一些函数

这段将会一步一步对前面那段代码通过有意思的方法扩展你的插件(同时让其他人扩展你的插件)。例如,我们插件的实现里面可以定义一个名叫"format"的函数来格式化高亮文本。我们的插件现在看起来像这样,默认的format方法的实现部分在hiligth函数下面。

Java代码  收藏代码
  1. // plugin definition    
  2. $.fn.hilight = function(options) {    
  3.   // iterate and reformat each matched element    
  4.   return this.each(function() {    
  5.     var $this = $(this);    
  6.     // ...    
  7.     var markup = $this.html();    
  8.     // call our format function    
  9.     markup = $.fn.hilight.format(markup);    
  10.     $this.html(markup);    
  11.   });    
  12. };    
  13. // define our format function    
  14. $.fn.hilight.format = function(txt) {    
  15. return '<strong>' + txt + '</strong>';    
  16. };     
      我们很容易的支持options对象中的其他的属性通过允许一个回调函数来覆盖默认的设置。这是另外一个出色的方法来修改你的插件。这里展示的技巧是进一步有效的暴露format函数进而让他能被重新定义。通过这技巧,是其他人能够传递他们自己设置来覆盖你的插件,换句话说,这样其他人也能够为你的插件写插件。 
      考虑到这个篇文章中我们建立的无用的插件,你也许想知道究竟什么时候这些会有用。一个真实的例子是Cycle插件.这个Cycle插件是一个滑动显示插件,他能支持许多内部变换作用到滚动,滑动,渐变消失等。但是实际上,没有办法定义也许会应用到滑动变化上每种类型的效果。那是这种扩展性有用的地方。 Cycle插件对使用者暴露"transitions"对象,使他们添加自己变换定义。插件中定义就像这样:

$.fn.cycle.transitions = { 

// ... 

}; 

这个技巧使其他人能定义和传递变换设置到Cycle插件。

2.5 保持私有函数的私有性

这种技巧暴露你插件一部分来被覆盖是非常强大的。但是你需要仔细思考你实现中暴露的部分。一但被暴露,你需要在头脑中保持任何对于参数或者语义的改动也许会破坏向后的兼容性。一个通理是,如果你不能肯定是否暴露特定的函数,那么你也许不需要那样做。

那么我们怎么定义更多的函数而不搅乱命名空间也不暴露实现呢?这就是闭包的功能。为了演示,我们将会添加另外一个“debug”函数到我们的插件中。这个 debug函数将为输出被选中的元素格式到firebug控制台。为了创建一个闭包,我们将包装整个插件定义在一个函数中。 

Java代码  收藏代码
  1.  (function($) {    
  2.   // plugin definition    
  3.   $.fn.hilight = function(options) {    
  4.     debug(this);    
  5.     // ...    
  6.   };    
  7.   // private function for debugging    
  8.   function debug($obj) {    
  9.     if (window.console && window.console.log)    
  10.       window.console.log('hilight selection count: ' + $obj.size());    
  11.   };    
  12. //  ...    
  13. })(jQuery);    

 

我们的“debug”方法不能从外部闭包进入,因此对于我们的实现是私有的。

2.6 支持Metadata插件

在你正在写的插件的基础上,添加对Metadata插件的支持能使他更强大。个人来说,我喜欢这个Metadata插件,因为它让你使用不多的"markup”覆盖插件的选项(这非常有用当创建例子时)。而且支持它非常简单。更新:注释中有一点优化建议。

Java代码  收藏代码
  1. $.fn.hilight = function(options) {    
  2.   // ...    
  3.   // build main options before element iteration    
  4.   var opts = $.extend({}, $.fn.hilight.defaults, options);    
  5.   return this.each(function() {    
  6.     var $this = $(this);    
  7.     // build element specific options    
  8.     var o = $.meta ? $.extend({}, opts, $this.data()) : opts;    
  9.     //...      

 这些变动行做了一些事情:它是测试Metadata插件是否被安装如果它被安装了,它能扩展我们的options对象通过抽取元数据这行作为最后一个参数添加到JQuery.extend,那么它将会覆盖任何其它选项设置。现在我们能从"markup”处驱动行为,如果我们选择了“markup”

 调用的时候可以这样写: jQuery.foo();  $.foo(); 

 

Java代码  收藏代码
  1. <!--  markup  -->    
  2. <div class="hilight { background: 'red', foreground: 'white' }">    
  3.   Have a nice day!    
  4. </div>    
  5. <div class="hilight { foreground: 'orange' }">    
  6.   Have a nice day!    
  7. </div>    
  8. <div class="hilight { background: 'green' }">    
  9.   Have a nice day!    
  10. </div>    
  11. 现在我们能高亮哪些div仅使用一行脚本:  
  12. $('.hilight').hilight();     

 

2.7 整合
下面使我们的例子完成后的代码:

    

Java代码  收藏代码
  1. // 创建一个闭包    
  2. (function($) {    
  3.   // 插件的定义    
  4.   $.fn.hilight = function(options) {    
  5.     debug(this);    
  6.     // build main options before element iteration    
  7.     var opts = $.extend({}, $.fn.hilight.defaults, options);    
  8.     // iterate and reformat each matched element    
  9.     return this.each(function() {    
  10.       $this = $(this);    
  11.       // build element specific options    
  12.       var o = $.meta ? $.extend({}, opts, $this.data()) : opts;    
  13.       // update element styles    
  14.       $this.css({    
  15.         backgroundColor: o.background,    
  16.         color: o.foreground    
  17.       });    
  18.       var markup = $this.html();    
  19.       // call our format function    
  20.       markup = $.fn.hilight.format(markup);    
  21.       $this.html(markup);    
  22.     });    
  23.   };    
  24.   // 私有函数:debugging    
  25.   function debug($obj) {    
  26.     if (window.console && window.console.log)    
  27.       window.console.log('hilight selection count: ' + $obj.size());    
  28.   };    
  29.   // 定义暴露format函数    
  30.   $.fn.hilight.format = function(txt) {    
  31.     return '<strong>' + txt + '</strong>';    
  32.   };    
  33.   // 插件的defaults    
  34.   $.fn.hilight.defaults = {    
  35.     foreground: 'red',    
  36.     background: 'yellow'    
  37.   };    
  38. // 闭包结束    
  39. })(jQuery);     

 

这段设计已经让我创建了强大符合规范的插件。我希望它能让你也能做到。

3、总结

jQuery为开发插件提拱了两个方法,分别是:

jQuery.fn.extend(object);  jQuery对象添加方法。
jQuery.extend(object);  
为扩展jQuery类本身.为类添加新的方法。

3.1 jQuery.fn.extend(object);

fn 是什么东西呢。查看jQuery代码,就不难发现。

jQuery.fn = jQuery.prototype = {  

init: function( selector, context ) {//....   

//......  

};   

原来 jQuery.fn = jQuery.prototype.prototype肯定不会陌生啦。虽然 javascript 没有明确的类的概念,但是用类来理解它,会更方便。jQuery便是一个封装得非常好的类,比如我们用 语句 $("#btn1") 会生成一个 jQuery类的实例。

jQuery.fn.extend(object); jQuery.prototype进得扩展,就是为jQuery类添加成员函数jQuery类的实例可以使用这个成员函数

比如我们要开发一个插件,做一个特殊的编辑框,当它被点击时,便alert 当前编辑框里的内容。可以这么做:

$.fn.extend({        

     alertWhileClick:function(){       

         $(this).click(function(){      

              alert($(this).val());       

          });       

      }       

});   

$("#input1").alertWhileClick(); //页面上为:<input id="input1" type="text"/>

$("#input1") 为一个jQuery实例,当它调用成员方法 alertWhileClick后,便实现了扩展,每次被点击时它会先弹出目前编辑里的内容。

3.2 jQuery.extend(object); 

jQuery类添加添加类方法,可以理解为添加静态方法。如:

$.extend({  

    add:function(a,b){return a+b;}  

});  

便为 jQuery 添加一个为 add 的 静态方法,之后便可以在引入 jQuery 的地方,使用这个方法了,$.add(3,4); //return 7

转载于:https://www.cnblogs.com/xiaohong/p/4378219.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsf 传参数_在JSF 2中对定制验证器进行参数化

jsf 传参数在JSF 2中编写自定义验证器并不是一项复杂的任务。 您实现Validator接口&#xff0c;添加FacesValidator批注&#xff0c;并在faces-config.xml中插入validator声明&#xff0c; 仅此而已 。 一块蛋糕。 但是&#xff0c;让我们考虑以下情形&#xff1a; 您需要自定义…

java应该怎么学习?

很多人刚接触java,比较迷茫,下面我简单梳理一下后端的框架,希望你们能对java有个清晰的认识。 java是一种纯面向对象的编程语言,也是三大编程语言之一。java是由sun公司于1995年开发,它被称为“一次编译,处处可用”。 Struts在项目中的作用 Struts 在项目主要起控制作用…

docker安装clickhouse_clickhouse ----入门

clickhouse作为现在流行的数据分析数据库&#xff0c;非常热门。我也眼馋了好久&#xff0c;想先本地单机安装下&#xff0c;网上搜索了好多。也遇到了好多问题。我这边讲述下自己安装的过程。我这边的电脑是mac.第一步是安装docker.执行命令 brew cask install docker。等dock…

怎么修改_论文查重之后怎么修改?

使用知网论文查重以后&#xff0c;发现论文重复率很高&#xff0c;该怎么办&#xff1f;论文查重后怎么改&#xff1f;今天paperfree小编给大家介绍一下。方法一&#xff1a;重写如果论文存在很高的重复率&#xff0c;都是抄袭别人的论文&#xff0c;我们就可以考虑重写。在重写…

基于谷歌模型gemini-pro 的开发的QT 对话项目

支持的功能&#xff0c;新建对话框&#xff0c;目前发现相关梯子不支持访问谷歌的api 的可能代理设置的不对&#xff0c; QNetworkAccessManager manager;// Set up your requestQNetworkRequest request;request.setUrl(QUrl("https://generativelanguage.googleapis.com…

Lucene.net站内搜索—5、搜索引擎第一版实现

目录 Lucene.net站内搜索—1、SEO优化 Lucene.net站内搜索—2、Lucene.Net简介和分词 Lucene.net站内搜索—3、最简单搜索引擎代码Lucene.net站内搜索—4、搜索引擎第一版技术储备&#xff08;简单介绍Log4Net、生产者消费者模式&#xff09;Lucene.net站内搜索—5、搜索引擎第…

All your files have been encrypted

小弟的姑姑家的老板收银的电脑被黑客黑了,我来解决一下,小孩玩游戏玩电脑中的病毒, 方法很多种,仅供参考。 问题邮件截图: 参考方式: 方法一:给对方钱,一般比较贵,还不如重装系统。哈哈。 方法二:下载解密工具,尝试解密恢复数据, Ransomware File Decrypto Too…

8s yaml 配置生成_接口测试框架实战(六) | 配置的数据驱动

《Python 测试开发实战进阶》课程&#xff0c;4 个月挑战 BAT 大厂年薪 50W Offer&#xff0c;文末加群&#xff01;在实际工作中&#xff0c;为了便于维护&#xff0c;对于环境的切换和配置&#xff0c;通常不会使用硬编码的形式完成。在之前文章《多环境下的接口测试》中&…

使用JAXB和Jackson从XSD生成JSON模式

在本文中&#xff0c;我演示了一种从XML Schema &#xff08;XSD&#xff09;生成JSON Schema的 方法 。 在概述从XML Schema创建JSON Schema的方法的同时&#xff0c;本文还演示了JAXB实现的用法&#xff08;与JDK 9捆绑在一起的xjc版本2.2.12-b150331.1824 [build 1.9.0-ea-b…

Spring Integration完整示例

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

配置环境_JavaJDK环境变量配置

1.Java环境搭建1.1 JDK与JREJDK(Java Development Kit Java开发工具包)JDK是提供给Java开发人员使用的&#xff0c;其中包含了java的开发工具&#xff0c;也包括了JRE。所以安装了JDK&#xff0c;就不用在单独安装JRE了。其中开发工具&#xff1a;编译工具(javac.exe)打包工具(…

僵固式思维 OR 成长式思维

有意无意中&#xff0c;看到这样的一篇文章&#xff0c;觉得非常富有正能量&#xff0c;而且也比较有同感。而且&#xff0c;不仅仅对于职场暂时失落或者失意的人有帮助&#xff0c;就是对学生&#xff0c;也一样的。故特分享&#xff0c;以共勉之。 我想每个新人进入职场之后都…

Asp.net MVC 的一些总结(二)——图片显示

这里实现的是&#xff0c;如下图片所示的效果&#xff1a; 当然&#xff0c;当你看的下图的时候&#xff0c;请不要自己想当然的认为是简单的html布局&#xff01;&#xff01;&#xff01; &#xff08;1&#xff09;业务说明&#xff1a;图片地址是数据库里存的&#xff0c;图…

Spring整合基础

本文是我们名为“ Spring Integration for EAI ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适…

java 布局管理器_有时在Java中,一个布局管理器是不够的

java 布局管理器在开发Java Swing应用程序时&#xff0c;最经常的是&#xff0c;我们需要在多个嵌套面板中使用多个布局管理器。 这通常不是问题&#xff0c;被认为是几乎所有人类已知语言的所有UI开发的常规做法。 但是&#xff0c;大多数情况下&#xff0c;对于UI中的每个面板…

支付宝支付、微信支付(最详细教程)

对接支付宝支付接口&#xff0c;官方文档已经写的很清楚了&#xff0c;但是也有很多像我一样的小白&#xff0c;第一次对接支付宝支付接口&#xff0c;会有些迷茫&#xff0c;所以我在此写下这篇文章&#xff0c;给我和我一样的同学&#xff0c;一点思路吧。 第一步&#xff1…

降雨插值_ArcGIS计算土壤侵蚀模数(二)降雨侵蚀力因子R计算

本次采用中国土壤流失方程CSLE计算土壤侵蚀模数&#xff0c;计算公式为&#xff1a;ARKLSBET式中&#xff0c;式中&#xff1a;A—土壤侵蚀模数。thm-2a-1&#xff1b;R—降雨侵蚀力因子&#xff0c;MJmmhm-2h-1a-1&#xff1b;K—土壤可蚀性因子&#xff0c;thm2hhm-2MJmm-1&a…

购买阿里云ECS服务器忘记终端管理密码或者没有设置

自己开发一个APP,想把源码放到服务器上跑一跑,发现使用Xshell远程连接不上去,我记得买服务器的时候没有设置。 一般有两种方法: 1.买服务器的时候,阿里会给你发一份邮件,邮件里面有,这个是官方的说法,我是公司CTO,账号是老板开的,根本不可能看到邮件,所以对我来说不…

输出空格隔开换行_【前端干货】CSS 的空格处理

一空格规则HTML 代码的空格通常会被浏览器忽略。<p>◡◡hello◡◡world◡◡</p>上面是一行 HTML 代码&#xff0c;文字的前部、内部和后部各有两个空格。为了便于识别&#xff0c;这里使用半圆形符号◡表示空格。浏览器的输出结果如下。hello world可以看到&#x…

宝塔面板绑定域名导致无法访问

用这个命令rm -f /www/server/panel/data/domain.conf删除绑定域名后&#xff0c; 就能用ip端口进入面板了&#xff0c;以后还是不要绑定域名了 主要是因为我手残。 看重点&#xff0c;我是绑定了域名&#xff0c;用域名也无法访问。 现在终于进去啦