开发jquery插件研究(一)

在编写jQuery插件时,必须假设jQuery库已经加载到了页面中。可是,我们不能假设$别名一定可用。也有与$别名产生冲突的时候。
对于代码比较长的插件来说,很多开发人员都觉得不能使用$别名会导致代码难以理解。为了解决这个问题,我们可以在插件的作用域内定义这个快捷方式,方法就是定义一个函数并马上调用它。这种定义并立即调用函数的语法通常被称为立即调用的函数表达式(IIFE,Immediately Invoked Function Expression):

(function($) {//在这里添加代码
  })(jQuery);

这个包装函数只接收一个参数,我们通过这个参数传入了jQuery对象。这个参数的名字是$,因此在这个函数内部,使用$别名就不会有冲突了。
jQuery内置的某些功能是通过全局函数提供的。所谓全局函数,实际上就是jQuery对象的方法,但从实践的角度上看,它们是位于jQuery命名空间内部的函数。

使用这种技术的一个典型的例子就是$.ajax()函数。$.ajax()所做的一切都可以通过简
单地调用一个名为ajax()的常规全局函数来实现,但是,这种方式会给我们带来函数名冲突的问题。通过把这个函数放在jQuery的命名空间内,我们只需避免它与其他的jQuery方法冲突即可。对想要使用插件的人而言,jQuery命名空间也是一个提醒,即要使用这个插件,必须要有jQuery库。
核心jQuery库提供的很多全局函数都是实用方法;所谓实用方法,就是一些常用功能的快捷方式,但即使手工编写同样功能的代码也不是很难。数组处理方法$.each()、$.map()和$.grep()都是实用方法。为了演示这些实用方法的创建方式,我们再给jQuery核心库添加两个小函数。
要向jQuery的命名空间中添加函数,只需将这个新函数指定为jQuery对象的一个属性即可。

(function($) { $.sum = function(array) {
//在这里添加代码};
})(jQuery);

于是,我们就可以在使用这个插件的任何代码中,编写如下代码:

$.sum();

这跟一个基本的调用没什么两样,调用之后就会执行函数体内的代码。
这个求和函数接受一个数组作为参数,然后把数组的值加在一起,最后返回结果。代码如下:

(function($) { 
  $.sum = function(array) {
     var total = 0;

     $.each(array, function(index, value) { 
        value = $.trim(value); 
        value =parseFloat(value) || 0;

        total += value; 
     });
     return total;
   }; 
 })(jQuery);

注意,我们在这里使用了$.each()方法遍历了数组的值。当然也可以在此使用for循环,但既然我们能够确定页面会在加载插件之前先加载jQuery库,使用习以为常的语法是很自然的。同样,$.each()的好处在于它的第一个参数是一个对象。

我们的插件在jQuery命名空间中创建了两个独立的全局函数。但这样写有可能污染命名空间。换句话说,其他jQuery插件也可能定义相同的函数名。为了避免冲突,最好的办法是把属于一个插件的全局函数都封装到一个对象中,代码如下所示:

(function($) {
  $.mathUtils = {
     sum: function(array) {
        var total = 0;

        $.each(array, function(index, value) { 
           value = $.trim(value); 
           value = parseFloat(value) || 0;

           total += value; 
         });
         return total; 
        },
        average: function(array) { 
            if ($.isArray(array)) {
              return $.mathUtils.sum(array) / array.length; 
             }
             return '';
          }
       };
     }) (jQuery);

这个模式的本质是为所有的全局函数又创建了一个命名空间,叫做jQuery.mathUtils。虽然我们还称它们为全局函数,但实际上它们已经成了mathUtils对象的方法了,而mathUtils对象则保存在jQuery对象的属性中。结果,在调用它们时就必须得加上插件的名字了:

$.mathUtils.sum(sum);
$.mathUtils.average(average);

使用这种技术(以及足够独特的命名空间),就能够避免全局函数污染命名空间。至此,我们已经掌握了开发插件的基本方法。在把这些函数保存到名为jquery.mathutils.js的文件中之后,就可以将其包含在其他页面中通过其他脚本来使用这些函数了。

jQuery中大多数内置的功能都是通过其对象实例的方法提供的,而且这些方法也是插件之所以诱人的关键。当函数需要操作DOM元素时,就是将函数创建为jQuery实例方法的好机会。
前面我们已经看到,添加全局函数需要以新方法来扩展jQuery对象。添加实例方法也与此类似,但扩展的却是jQuery.fn对象:

jQuery.fn.myMethod = function() { 
    alert('Nothing happens.');

};

然后,就可以在使用任何选择符表达式之后调用这个新方法了:

 $('div').myMethod();

当调用这个方法时会弹出一个警告框。由于这里并没有在任何地方用到匹配的DOM节点,所以为此编写一个全局函数也是一样的。由此可见,一个合理的实例方法应该包含对它的上下文的操作。

未完待续(_)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,316评论 0 2
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,147评论 0 1
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,073评论 25 707
  • 今天终于把离职手续办完了,明天就可以走了,其实突然心中还有点难受。人可能就是这样,拥有的时候不屑一顾,等到真正要失...
    木知舟423阅读 6,026评论 248 136
  • 在千帆竞发、百舸争流的民办学校里, 有一艘航船劈波斩浪,势不可挡; 在人才济济、群英荟萃的教育战线上, 有一群人风...
    赵金芳阅读 577评论 1 9