跳转到主要内容
东方龙马 提交于 16 November 2012

本文作者简介

Casio(大家通常叫他“表”),是我之前在shift2的同事,最近他专门为我们的Drupal中国站点写了点jQuery方面的总结,与大家分享一下他的编写jQuery插件的经验,在此感谢表!

 

在龙马的Drupal中国(http://drupalchina.cn/)站里看到关于jQuery的插件开发还处于空缺状态,就想反正也有时间就总结个吧,写得不好,希望大家多多指教。

jQuery已经被广泛使用,凭借其简洁的API,对DOM强大的操控性,易扩展性越来越受到web开发人员的喜爱,我也写过一些插件,所以写这个小结仅对入门的人了解探讨。

开发插件基础

  • 样式

说到样式想到的肯定是CSS,我们讨论的不是好看的页面效果和漂亮的设计,我们只是了解CSS基本样式,其实也就是CSS的一些属性如:position,margin,padding,width,height,left,top,float,border,background...掌握css应该从简单做起,从基本入手,在实践中运用并不断深入。

  • JS脚本

我们同样需要对JavaScript有着深刻的理解,对dom, xhr, Regex, call-apply, prototype等都应该有一定的了解。有人会说要这些有啥用啊,对dom的操作其实通过getElementById, getElementsByTagName以及其他的API都可以轻松的完成,这话是没错,当思路确定后,思想才是重点,一段代码是精华还是糟粕很容易就可以区分出来,究其原因还是取决你自己,举个简单的例子,在开发中有时候会用到大量的html组装,如:

A写的代码:

var a = new Array(10); var menu = ''; for (var i = 0; i < a.length; i++) { menu += '
  • ' + a[i] + '
  • '; }

    B写的代码

    String.prototype.format = function() { var args = arguments; return this.replace(/{(\d{1})}/g, function() { return args[arguments[1]]; }); }; var a = new Array(1,2,3,4,5,6,7,8,9,0); var m = '
  • {0}
  • '; for (var i = 0; i < a.length; i++) { menu += m.format(a[i]); }

    同样都能达到相同的效果,你会选择那个?很显然是在实现方式明确的情况下,高效的代码显然更具吸引力。

    好了,了解完这些基础之后,我们正式踏上我们的开发插件之旅。可能很枯燥,但之要你坚持看完你一定能有所收获。

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

    1、类级别的插件开发

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

    1.1 添加一个新的全局函数

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

    jQuery.foo = function() { alert('This is a test. This is only a test.'); };

    1.2 增加多个全局函数

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

    jQuery.foo = function() { alert('This is a test. This is only a test.'); }; jQuery.bar = function(param) { alert('This function takes a parameter, which is "' + param + '".'); };

    调用时和一个函数的一样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar');

    1.3 使用jQuery.extend(object);

    jQuery.extend({ foo: function() { alert('This is a test. This is only a test.'); }, bar: function(param) { alert('This function takes a parameter, which is "' + param +'".'); } });

    1.4 使用命名空间

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

    jQuery.myPlugin = { foo:function() { alert('This is a test. This is only a test.'); }, bar:function(param) { alert('This function takes a parameter, which is "' + param + '".'); } };

    采用命名空间的函数仍然是全局函数,调用时采用的方法:

    $.myPlugin.foo(); $.myPlugin.bar('baz');

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

    板块