制作高质量的JQuery Plugin 插件的方法


Posted in Javascript onApril 20, 2010

JQuery Plugin插件,如果大家不明白什么是JQuery插件或都不清楚如何编写可以查看其官方的网站:jQuery Authoring Guidelines
好了,下面有一些我觉得想做一个好的插件必须应有的要求:
1、在JQuery命名空间下声明只声明一个单独的名称
2、接受options参数,以便控制插件的行为
3、暴露插件的默认设置 ,以便外面可以访问
4、适当地将子函数提供给外部访问调用
5、保持私有函数
6、支持元数据插件
下面将逐条地过一遍:
只声明一个单独的名称
这表明是一个单独的插件脚本。如果你的脚本包含多个插件或者是互补的插件(像$.fn.doSomething()和$.undoSomething()),那么你可以根据要求声明多个名称。但一般情况下,力争用单一的名称来维持插件现实的所有细节。
在本例中,我们将声明一个叫“hilight”的名称

// 插件的定义 
$.fn.hilight = function( options ){ 
// 这里就是插件的实现代码了... 
}; 
然后我们可以像这样调用它: 
$("divTest").hilight();

接受一个options参数,以便控件插件的行为
$.fn.hilight = function(options){ 
var defaults = { 
foreground : 'red', 
background : 'yellow' 
}; 
//Extends out defaults options with those privided 扩展我们默认的设置 
$.extend(defaults,options); 
};

而我们可以这样使用它:
$('#myDiv').hilight({ 
foreground: 'blue' 
});

暴露插件的默认设置 ,以便外面可以访问
作为插件的提升和优化,我们应该将上面的代码暴露出来作为插件的默认设置。
这非常重要,这样做让使用插件的用户可以非常容易地用最少的代码重写或自定义该插件。然而这个我们可以借助JavaScript function对象的优势:
$.fn.hilight = function(options){ 
//Extend our default options with those provided 
//Note that the first arg to extend is an empty object 
//this is to keep from overriding our "defaults" object 
var opts = $.extend({},$.fn.hilight.defaults,options); 
} 
$.fn.hilight.defaults = { 
foreground : 'red', 
background : 'yellow' 
};

这里值得注意的是$.extend()第一个参数是一个空的对象,这样可以让我们重写插件的默认设置
用户可以像这样使用插件:
// override plugin default foreground color 
$.fn.hilight.defaults.foreground = 'blue'; 
// ... 
// invoke plugin using new defaults 
$('.hilightDiv').hilight(); 
// ... 
// override default by passing options to plugin method 
$('#green').hilight({ 
foreground: 'green' 
});

适当地将子函数提供给外部访问调用
这个例子延续前面的例子,你会发现有一个有趣的方法可以扩展你的插件(然后还可以让其他人扩展你的插件 :))。例如,我们在插件里声明了一个函数叫“format”用来高这显示文本,我们的插件实现代码可能是这样子的:
$.fn.hight = function(options){ 
//iterate and reformat each mached element 
return this.each(function(){ 
var $this = $(this); 
//... 
var markup = $this.html(); 
//call our format function 
markup = $.fn.hilight.format(markup); 
$this.html(markup); 
}); 
}; 
//define our format function 
$.fn.hilight.format = function(txt){ 
return '<strong>' + txt + '</strong>'; 
};

保持私有函数
暴露插件有部分内容提供重写看上去似乎非常强大,但是你必须认真地考虑你的插件哪一部分是需要暴露出来的。一旦暴露出来,你就需要考虑这些变化点,一般情况下,如果你没有把握哪部分需要暴露出来,那么你可以不这样做。
那如何才能够定义更多的函数而不将其暴露出来呢?这个任务就交给闭包吧。为了证实,我们在插件中添加一个函数叫“debug”,这debug函数将会记录已选择的元素数量到FireBug控制台中。为了创建闭包,我们将插件定义的整部分都包装起来:
//create closure 
(function($){ 
//plugin definition 
$.fn.hilight = function(options){ 
debug(this); 
//... 
}; 
//private function for debuggin 
function debug($obj){ 
if(window.console && window.console.log){ 
window.console.log('hilight selection count :' + $obj.size()); 
} 
} 
//... 
//end of closure 
})(jQuery);

这样“debug”方法就不能被闭包这外调用了
支持元数据插件
依赖于所写的插件类型,并支持元数据插件会使得其本身更加强大。个人来讲,我喜欢元素据插件,因为它能让你分离标签中重写插件的配置(这在写demo和示例时特别有用)。最重要的是,想现实它特别的容易!
$.fn.hilight = function(options){ 
//build main options before element interation 
var opts = $.extend({},$.fn.hilight.defaults,options); 
return this.each(function(){ 
var $this = $(this); 
//build element specific options 
var o = $.meta ? $.extend({},opts,$this.data()) : opts; 
//一般句话,搞定支持元数据 功能 
}); 
}

几行的变化完成了以下几件事:
1、检测元数据是否已经配置
2、如果已配置,将配置属性与额外的元数据进行扩展
<!-- markup --> 
<div class="hilight { background: 'red', foreground: 'white' }"> 
Have a nice day!这是元数据 
</div> 
<div class="hilight { foreground: 'orange' }"> 
Have a nice day!在标签中配置 
</div> 
<div class="hilight { background: 'green' }"> 
Have a nice day! 
</div>

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

最后,将全部代码放在一起:
// 
//create closure 
// 
(function($){ 
// 
// plugin definition 
// 
$.fn.hilight = function(options){ 
debug(this); 
//build main options before element iteration 
var opts = $.extend({}, $.fn.hilight.defaults, options); 
//iterate and reformat each matched element 
return this.each(function(){ 
$this = $(this); 
//build element specific options 
var o = $.meta ? $.extend({}, opts, $this.data()) : opts; 
//update element styles 
$this.css({ 
backgroundColor: o.background, 
color: o.foreground 
}); 
var markup = $this.html(); 
//call our format function 
}); 
} 
// 
// private function for debugging 
// 
function debug($obj){ 
if(window.console && window.console.log){ 
window.console.log('hilight selection count: ' + $obj.size()); 
} 
}; 
// 
// define and expose our format function 
// 
$.fn.hilight.format = function(txt){ 
return '<strong>' + txt + '</strong>'; 
}; 
// 
// plugin defaults 
// 
$.fn.hilight.defaults = { 
foreground : 'red', 
background : 'yellow' 
}; 
// 
// end of clousure 
// 
})(jQuery);

转载请注明出处http://samlin.cnblogs.com
比较希望大家开发jquery plugin的时候可以在最后把方法开放出来
return {
method1: funcion() {},
method2: funcion() {}
}

这样我们在使用的时候就可以用如下方式调用
var plugin = $("<div/>").plugin();
plugin.mehtod1();
plugin.method2();

Javascript 相关文章推荐
jQuery 取值、赋值的基本方法整理
Mar 31 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 Javascript
JS之获取样式的简单实现方法(推荐)
Sep 13 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
Jan 24 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
Apr 22 Javascript
jQuery遍历节点方法汇总(推荐)
May 13 jQuery
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
Jun 16 Javascript
使用canvas进行图像编辑的实例
Aug 29 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
Sep 17 Javascript
react-native滑动吸顶效果的实现过程
Jun 03 Javascript
简谈创建React Component的几种方式
Jun 15 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
Apr 20 #Javascript
jquery+json 通用三级联动下拉列表
Apr 19 #Javascript
javascript中的变量是传值还是传址的?
Apr 19 #Javascript
js获取当前select 元素值的代码
Apr 19 #Javascript
监控 url fragment变化的js代码
Apr 19 #Javascript
jquery获取input表单值的代码
Apr 19 #Javascript
编写高性能的JavaScript 脚本的加载与执行
Apr 19 #Javascript
You might like
解析csv数据导入mysql的方法
2013/07/01 PHP
php+ajax导入大数据时产生的问题处理
2014/06/11 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
js操作二级联动实现代码
2010/07/27 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
深入理解bootstrap框架之第二章整体架构
2016/10/09 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
Vue 打包体积优化方案小结
2020/05/20 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
详解Python爬虫的基本写法
2016/01/08 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
Python识别处理照片中的条形码
2020/11/16 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
C#中的验证控件有几种
2014/03/08 面试题
借款协议书
2014/04/12 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis