当前位置: 首页 > news >正文

如何写一个Jquerynbsp;的Plugin插件

JQuery Plugin插件,如果大家不明白什么是JQuery插件或都不清楚如何编写可以查看其官方的网站:jQuery Authoring Guidelines

 

好了,下面有一些我觉得想做一个好的插件必须应有的要求:

1、在JQuery命名空间下声明只声明一个单独的名称

2、接受options参数,以便控制插件的行为

3、暴露插件的默认设置 ,以便外面可以访问

4、适当地将子函数提供给外部访问调用

5、保持私有函数

6、支持元数据插件

 

下面将逐条地过一遍:

只声明一个单独的名称

这表明是一个单独的插件脚本。如果你的脚本包含多个插件或者是互补的插件(像$.fn.doSomething()和$.undoSomething()),那么你可以根据要求声明多个名称。但一般情况下,力争用单一的名称来维持插件现实的所有细节。

在本例中,我们将声明一个叫“hilight”的名称

 

Js代码    收藏代码
  1. // 插件的定义  
  2. $.fn.hilight functionoptions ){  
  3.     // 这里就是插件的实现代码了...  
  4.       
  5. };  
 

然后我们可以像这样调用它:

 

Js代码    收藏代码
  1. $("divTest").hilight();  
 

 

 

接受一个options参数,以便控件插件的行为

Js代码    收藏代码
  1. $.fn.hilight function(options){  
  2.     var defaults  
  3.         foreground       'red' 
  4.         background       'yellow'  
  5.     };  
  6.     //Extends out defaults options with those privided 扩展我们默认的设置  
  7.     $.extend(defaults,options);  
  8. };  
 

而我们可以这样使用它:

 

Js代码    收藏代码
  1. $('#myDiv').hilight({  
  2.   foreground: 'blue'  
  3. });  
 

 

暴露插件的默认设置 ,以便外面可以访问

作为插件的提升和优化,我们应该将上面的代码暴露出来作为插件的默认设置。

这非常重要,这样做让使用插件的用户可以非常容易地用最少的代码重写或自定义该插件。然而这个我们可以借助JavaScript function对象的优势:

 

Js代码    收藏代码
  1. $.fn.hilight function(options){  
  2.     //Extend our default options with those provided  
  3.     //Note that the first arg to extend is an empty object  
  4.     //this is to keep from overriding our "defaults" object  
  5.     var opts $.extend({},$.fn.hilight.defaults,options);  
  6.  
  7. $.fn.hilight.defaults  
  8.     foreground       'red' 
  9.     background       'yellow'  
  10. };  
 

这里值得注意的是$.extend()第一个参数是一个空的对象,这样可以让我们重写插件的默认设置

用户可以像这样使用插件:

 

Js代码    收藏代码
  1. // override plugin default foreground color  
  2. $.fn.hilight.defaults.foreground 'blue' 
  3. // ...  
  4. // invoke plugin using new defaults  
  5. $('.hilightDiv').hilight();  
  6. // ...  
  7. // override default by passing options to plugin method  
  8. $('#green').hilight({  
  9.   foreground: 'green'  
  10. });  
 

适当地将子函数提供给外部访问调用

这个例子延续前面的例子,你会发现有一个有趣的方法可以扩展你的插件(然后还可以让其他人扩展你的插件 :))。例如,我们在插件里声明了一个函数叫“format”用来高这显示文本,我们的插件实现代码可能是这样子的:

 

Js代码    收藏代码
  1. $.fn.hight function(options){  
  2.     //iterate and reformat each mached element  
  3.     return this.each(function(){  
  4.         var $this $(this);  
  5.         //...  
  6.         var markup $this.html();  
  7.         //call our format function  
  8.         markup $.fn.hilight.format(markup);  
  9.         $this.html(markup);  
  10.     });  
  11. };  
  12. //define our format function  
  13. $.fn.hilight.format function(txt){  
  14.     return '' txt '' 
  15. };  
 

 

保持私有函数

暴露插件有部分内容提供重写看上去似乎非常强大,但是你必须认真地考虑你的插件哪一部分是需要暴露出来的。一旦暴露出来,你就需要考虑这些变化点,一般情况下,如果你没有把握哪部分需要暴露出来,那么你可以不这样做。

那如何才能够定义更多的函数而不将其暴露出来呢?这个任务就交给闭包吧。为了证实,我们在插件中添加一个函数叫“debug”,这debug函数将会记录已选择的元素数量到FireBug控制台中。为了创建闭包,我们将插件定义的整部分都包装起来:

 

Js代码    收藏代码
  1. //create closure  
  2. (function($){  
  3.     //plugin definition  
  4.     $.fn.hilight function(options){  
  5.         debug(this);  
  6.         //...  
  7.     };  
  8.     //private function for debuggin  
  9.     function debug($obj){  
  10.         if(window.console && window.console.log){  
  11.             window.console.log('hilight selection count :' $obj.size());  
  12.          
  13.      
  14.     //...  
  15.     //end of closure  
  16. })(jQuery);  
 

 

这样“debug”方法就不能被闭包这外调用了

 

支持元数据插件

 

依赖于所写的插件类型,并支持元数据插件会使得其本身更加强大。个人来讲,我喜欢元素据插件,因为它能让你分离标签中重写插件的配置 (这在写demo和示例时特别有用)。最重要的是,想现实它特别的容易!

 

 

Js代码    收藏代码
  1. $.fn.hilight function(options){  
  2.     //build main options before element interation  
  3.     var opts $.extend({},$.fn.hilight.defaults,options);  
  4.     return this.each(function(){  
  5.         var $this $(this);  
  6.         //build element specific options  
  7.         var $.meta $.extend({},opts,$this.data()) opts;  
  8.   
  9.          //一般句话,搞定支持元数据 功能         
  10.     });  
  11.  
 

几行的变化完成了以下几件事:

1、检测元数据是否已经配置

2、如果已配置,将配置属性与额外的元数据进行扩展

 

Html代码   Have a nice day!这是元数据
Have a nice day!在标签中配置
Have a nice day!
" wmode="transparent">  收藏代码
  1.   
  2. <</SPAN>div class="hilight background: 'red', foreground: 'white' }">  
  3.   Have nice day!这是元数据  
  4. </</SPAN>div>  
  5. <</SPAN>div class="hilight foreground: 'orange' }">  
  6.   Have nice day!在标签中配置  
  7. </</SPAN>div>  
  8. <</SPAN>div class="hilight background: 'green' }">  
  9.   Have nice day!  
  10. </</SPAN>div>  
 

然后我们通过一句脚本就可以根据元数据配置分开地高亮显示这些div标签:

 

 

Js代码    收藏代码
  1. $('.hilight').hilight();  
 

最后,将全部代码放在一起:

 

Js代码    收藏代码
  1. //  
  2. //create closure  
  3. //  
  4. (function($){  
  5.     //  
  6.     // plugin definition  
  7.     //  
  8.     $.fn.hilight function(options){  
  9.         debug(this);  
  10.         //build main options before element iteration  
  11.         var opts $.extend({}, $.fn.hilight.defaults, options);  
  12.         //iterate and reformat each matched element  
  13.         return this.each(function(){  
  14.             $this $(this);  
  15.             //build element specific options  
  16.             var $.meta $.extend({}, opts, $this.data()) opts;  
  17.             //update element styles  
  18.             $this.css({  
  19.                 backgroundColor: o.background,  
  20.                 color: o.foreground  
  21.             });  
  22.             var markup $this.html();  
  23.         //call our format function  
  24.           
  25.         });  
  26.      
  27.       
  28.     //  
  29.     // private function for debugging  
  30.     //  
  31.     function debug($obj){  
  32.         if(window.console && window.console.log){  
  33.             window.console.log('hilight selection count: ' $obj.size());  
  34.          
  35.     };  
  36.     //  
  37.     // define and expose our format function  
  38.     //  
  39.     $.fn.hilight.format function(txt){  
  40.         return '' txt '' 
  41.     };  
  42.       
  43.     //  
  44.     // plugin defaults  
  45.     //  
  46.     $.fn.hilight.defaults  
  47.         foreground       'red' 
  48.         background       'yellow'  
  49.     };  
  50.       
  51.     //  
  52.     // end of clousure  
  53.     //  
  54. })(jQuery);  
 

 

 

 

2.

如何写一个Jquery 的Plugin插件

 

最近做项目想要一个控制会计数字输入的jquery插件,找了好久找不到, 没用办法,只有自己操刀上阵了,其实要求也不高, 就是: 
1. 默认是: 0.00 
2. 只能输入数字和小数点, 其它输入将被忽略 
3. 输入整数后继续自动保持两位小数 
4. 可以定义自己想保留几位小数

 

 

OK, 开始动手:

首先, 通过将函数封装为jquery plugin包, 可以将这个包非常容易的在各种项目和页面中使用, 而且代码管理维护起来方便. 再说, jquery的plugin实现起来超简单,为什么不这么做呢?如果你是第一次开发, 先阅读下这篇文章吧: How jQuery Works

 

一. Jquery Plugin 的基本框架

 

Js代码    收藏代码
  1. (function($)  
  2.     $.fn.extend({  
  3.         MyPlugin: function(options)  
  4.             var defaults  
  5.                 decimal_length: 2,  
  6.             };  
  7.             var options $.extend(defaults, options);  
  8.             var len parseInt(options['decimal_length']);  
  9.             return this.each(function()  
  10.                 alert('edison');  
  11.             });  
  12.          
  13.     });  
  14. })(jQuery);  
 

其中options就是参数, 调用方法为:

 

Js代码    收藏代码
  1. $('#ddd').MyPlugin({decimal_length:2});  

 

好的, 我们接着完成要的功能: 文件名为 money.js

 

Js代码  

相关文章:

  • 使用CSSnbsp;3创建不规则图形
  • 4人卖睡衣年赚7000万!绝对…
  • 我所理解的技术领导力
  • 问问题的艺术
  • 程序员发展十分重要的12条日常习惯
  • 暗时间
  • 说说程序员与博客
  • 自由职业者:如何找到你的第…
  • 要怎样努力,才能成为很厉害…
  • 人造超强大脑:取代人类的计…
  • 网站,越简单越好
  • Git工作流指南:集中式工作…
  • 对代码命名的一点思考和理解
  • 10个最“优秀”的代码注释
  • 【转】常用到的特殊符号整理
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【翻译】babel对TC39装饰器草案的实现
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2017 年终总结 —— 在路上
  • Android交互
  • bearychat的java client
  • ES6系列(二)变量的解构赋值
  • HTTP--网络协议分层,http历史(二)
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • iOS | NSProxy
  • Java反射-动态类加载和重新加载
  • Java精华积累:初学者都应该搞懂的问题
  • Linux快速复制或删除大量小文件
  • MySQL数据库运维之数据恢复
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • REST架构的思考
  • RxJS: 简单入门
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • SegmentFault 2015 Top Rank
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 从零开始学习部署
  • 大整数乘法-表格法
  • 老板让我十分钟上手nx-admin
  • 前端面试题总结
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 微信小程序设置上一页数据
  • 小程序开发之路(一)
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 最简单的无缝轮播
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #NOIP 2014#Day.2 T3 解方程
  • #QT(智能家居界面-界面切换)
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (排序详解之 堆排序)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (已解决)什么是vue导航守卫
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)机器学习的数学基础(1)--Dirichlet分布