快速开发 jQuery 插件的 10 大技巧

标签: 综合新闻 | 发表时间:2013-06-26 15:18 | 作者:
出处:http://www.oschina.net/?from=rss

在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式。这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了。

使用相同的设计模式和架构也让修复bug或者二次开发更容易。一套经过验证的架构可以保证我的插件不出大的问题,不论插件简单还是复杂。

我在这里分享10条我总结的经验。

 

1. 把你的代码全部放在闭包里面

这是我用的最多的一条。但是有时候在闭包外面的方法会不能调用。不过你的插件的代码只为你自己的插件服务,所以不存在这个问题,你可以把所有的代码都放在闭包里面。而方法可能应该放在Prototype方法内部,我们后面会讲到这一点。

( function($)
{
//code here
})(jQuery);

2. 提供插件的默认选项

你的插件应该会有一些选项是可以让开发者设置的,所以提供恢复默认选项是以有必要的。你可以通过 jQuery的extend功能来设置这些选项:

var defaultSettings = {
mode            : ’Pencil’,
lineWidthMin    : ’0′,
lineWidthMax    : ’10′,
lineWidth       : ’2′
};

settings = $.extend({}, defaultSettings, settings || {});

3. 使用返回一个元素

JavaScript/jQuery有一个很好的特点就是可以进行方法级联,所以我们不应该破坏这个特性,始终在方法中返回一个元素。我在我的每一个jQuery插件中都遵守这一条。

$.fn.wPaint =  function(settings)
{
return  this.each( function()
{
var elem = $( this);

//run some code here
}
}

4. 一次性代码放在主循环以外

这一条很重要,但是常常被忽略。简单的讲,如果你有一段代码是一堆默认值,只需要被实例化一次,而不是每次调用你插件功能的时候都实例化,你应该把 这段代码放在插件方法的外面。这样可以让你的插件运行的更高效,节省内存。我们将会在后面讨论prototype的时候,看这个方法在实际中的运用。

var defaultSettings = {
mode            : ’Pencil’,
lineWidthMin    : ’0′,
lineWidthMax    : ’10′,
lineWidth       : ’2′
};

$.fn.wPaint =  function(settings)
{
settings = $.extend({}, defaultSettings, settings || {});

return  this.each( function()
{
var elem = $( this);

//run some code here
}
}

你可以注意到,上面代码中的“defaultSettings”是完全在插件方法外面的,由于这些代码是在闭包里面,我们不用担心这些变量被重写。

5. 为什么要设置 Class Prototyping

作为你代码的血与肉,方法和函数应该放在prototype函数内。有两个原因:

◆ 它可以节省很多内存,因为可以不用重复创建这些方法。

◆ 引用一个现成的方法比重新创建一个好快很多。

简单的说,prototype就是扩展了一个对象,为它提供方法,而不用在每一个对象中实例化这些方法。这也让你的代码更有条理和高效。一旦你习惯这种开发方式,你会发现它在你将来的项目中为你节省了很多时间。

6. 如何设置 Class Prototyping

设置一个 prototype 方法有两个部分。首先我们需要创建我们最初的类定义,在多数情况下这就意味着创建一个对象。这个定义包含了每一个对象实例都不同的部分。在我的Paint jQuery Plugin 插件中,我是这么写的:

function Canvas(settings)
{
this.settings = settings;
this.draw =  false;
this.canvas =  null;
this.ctx =  null;

return  this;
}

下面来添加全局的方法:

Canvas.prototype =
{
generate:  function()
{
//generate code
}
}

这里的关键是要让prototype的方法是通用的,但是数据是每个实例自己的,可以用“this”引用。

7. 使用 “this” 对象

通过使用“$this”,我们可以向别的闭包传递正确的引用。我们也可能需要向别的方法传入 $this 引用。需要注意的是, $this 这个名字是可以改的,任意的变量名都可以。

Canvas.prototype =
{
generate:  function()
{
//some code

var $ this =  this;

var buton = //…some code

button.click( function(){
//using this will not be found since it has it’s own this

//use $this instead.

$ this.someFunc($ this);
});
},

someFunc:  function($ this)
{
//won’t know what ”this” is.
//use $this instead passed from the click event
}
}

8. 在每一个对象中保存设置

我一直在每一个对象中保存自己的设置,然后操作它自己的设置。这样你就不用在不同的方法中传递很多参数。把这些变量放在对象中,也方便你在其他地方调用这些变量。

function Canvas(settings)
{
this.settings = settings;

return  this;
}

9. 分离你的Prototype方法逻辑

这可能是一个基本的原则。当你在犹豫是否需要提供一个方法的时候,你可以问你自己 “如果其他人要重写这个方法的话,你的代码是否能满足他的需求?”或者“别人来写这个方法有多困难?”。当然这是一个灵活性拿捏的问题。这里列出了我的 Color Picker jQuery Plugin 的方法,你可以参考一下:

generate()
appendColors()
colorSelect()
colorHoverOn()
colorHoverOff()
appendToElement()
showPalette()
hidePalette()

10. 提供 Setter/Getter 选项

这一条不是必须的,但是我发现我所有的插件都包用到了这一条。因为它只需要一点点代码,就能为别人提供一个他可能需要的功能。

基本上,我们只要让开发者能够设置或者获取元素已经存在的值:

var lineWidth = $(“#container”).wPaint(“lineWidth”);
$(“#container”).wPaint(“lineWidth”, ”5″);

首先我们要把元素和对象关联起来,然后我们就可以引用它。我们在返回元素之前做如下操作:

return  this.each( function()
{
var elem = $( this);

var canvas =  new Canvas(settings);

//run some code here

elem.data(“_wPaint_canvas”, canvas);
}

下面的代码明确了我们究竟要做什么:

$.fn.wPaint =  function(option, settings)
{
if( typeof option === ’object’)
{
settings = option;
}
else  if( typeof option === ’string’)
{
if(
this.data(‘_wPaint_canvas’) &&
defaultSettings[option] !== undefined
){
var canvas =  this.data(‘_wPaint_canvas’);

if(settings)
{
canvas.settings[option] = settings;
return  true;
}
else
{
return canvas.settings[option];
}
}
else
return  false;
}

return  this.each( function()
{
//run some code here
}
}

以上十条基本上覆盖了jQuery插件开发的核心,并且可以作为开发的模板。有一套基本的代码可以极大的缩短你的开发时间,并且能够让你设计插件架构的时候更自信。

相关 [开发 jquery 插件] 推荐:

jquery插件的开发

- - CSDN博客推荐文章
插件的概念大家并不陌生了,插件可以很方便我们进行代码开发,大大节约了我们的开发时间. 以前我用jquery都是自己洗一大把的代码,复用性不高维护也不方便. 因此自己学着开发了2个简单的jquery插件. 下面先看下jquery插件的分类. jQuery开发分为两种:. 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法.

js/jQuery插件开发及规范

- - JavaScript - Web前端 - ITeye博客
当我们画出了UI之后就可以正式编写jQuery插件代码了,不过在着之前我们还需要对jQuery插件开发的一些规范性有一些了解.  这是来自jQuery官方的插件开发规范要求,使用这种编写方式有什么好处呢. c) 兼容jQuery操作符'$'和'jQuery'. 我们知道这段代码在被解析时会形同如下代码:.

深入理解jQuery插件开发

- - 博客 - 伯乐在线
英文原文: Extraordinary Thougths  ,编译: 伯乐在线—— 戴嘉华. 如果你看到这篇文章,我确信你毫无疑问会认为jQuery是一个使用简便的库. jQuery可能使用起来很简单,但是它仍然有一些奇怪的地方,对它基本功能和概念不熟悉的人可能会难以掌握. 但是不用担心,我下面已经把代码划分成小部分,做了一个简单的指导.

jquery 插件

- - JavaScript - Web前端 - ITeye博客
 jQuery插件的开发包括两种:. 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法. jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法. 下面就两种函数的开发做详细的说明. 1 、类级别的插件开发.

Web开发者必备的20款超赞jQuery插件

- Frank Cai - CSDN博客推荐文章
 jQuery的易扩展性吸引了来自全球的开发者来共同编写jQuery插件. jQuery插件不仅能够增强网站的可用性,有效地改善用户体验,还可以大大减少开发时间. 现在的jQuery插件很多,可以根据您的项目需要来选择. 这里为您介绍20款非常不错的插件. Lettering.js是一个轻量经的、易于使用的jQuery插件,可创造出极具个性的网页排版,是2010年最佳jQuery插件之一.

快速开发 jQuery 插件的 10 大技巧

- - 开源中国社区最新新闻
在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式. 这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了. 使用相同的设计模式和架构也让修复bug或者二次开发更容易. 一套经过验证的架构可以保证我的插件不出大的问题,不论插件简单还是复杂.

9 个单页面网站开发必备的 jQuery 插件

- - ITeye资讯频道
单页面网站作为简单快捷、易于维护的页面设计方案,越来越受到工作室、作品集或者个人博客类网站用户的青睐,我们可以使用不同的特效来使得页面更加的丰富和炫动. 今天我们将介绍几款可以作为单页面开发的jQuery插件,帮助大家快速简便的实现一个单页面的网站设计,希望大家喜欢. 使用这个插件,可以帮助你快速搭建一个滚动的页面导航,如果你需要比较简单直接的方式开发一个单页面的网站,这个插件是一个不错的选择.

50个WEB开发人员需要的jQuery插件

- - Jackchen Design 1984
jQuery插件是很多前端开发人员和网页设计师都会设计的东西. 这些插件大大的缩短了工作时间,调高了设计开发人员的效率. 精力的缩减对于开发人员来说是绝对需要的. 那么除了需要你有好的用户体验的经验还要学会去搜集优秀的插件以备未来使用. 今天我们要分享出来的就是一些非常优秀的jQuery插件. 去了解这些插件带来的体验和便捷.

最佳6款用于移动网站开发的 jQuery 图片滑块插件

- - 博客园_梦想天空
  随着智能手机的普及,越来越多的用户喜欢通过手机中浏览网页. 今天这篇文章为大家推荐最佳6款用于移动应用的. jQuery 图片滑块插件,这些插件很好的处理了触屏事件,效果平滑,帮助你构建用户体验良好的移动网站. PhotoSwipe 是一款免费的. jQuery 图片库插件,支持 iPhone, iPad, Android, Blackberry 等各种移动设备.

为设计师和开发者提供的10个超棒 jQuery 插件

- - 开源中国社区最新新闻
Zoomooz是一款制作网页元素变焦的jQuery插件,它可以制作像Prezi幻灯片和缩放图片或者其他细节. MediaElement.js不是为现代浏览器提供一个HTML5播放器和为老版本的浏览器提供一个完全独立的Flash播放器的插件,而是升级与自己定义的Flash和Sliverlight插件来模仿HTML5 MediaElement的API.