`
liu.da101
  • 浏览: 7811 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

jQuery插件开发 - 翻译自官网

阅读更多

1,开始

可以通过为jQuery.fn增加一个新的函数来编写jQuery插件。属性的名字就是你的插件的名字:

 

jQuery.fn.myPlugin = function(){
    //开始写你的代码吧!
};

 

 但是,那惹人喜爱的美元符号$哪里去了?她就是jQuery,但是为了确保你的插件与其他使用$的库不冲突,最好使用一个立即执行的匿名函数,这个匿名函数的参数是jQuery,这样其他的库就可以放心的使用$符号了。

 

(function( $ ){
  $.fn.myPlugin = function() {
  
    // 开始吧!

  };
})( jQuery );

 

 这样更好了就。在闭包内,可以放心的使用$符号了~

2,上下文

现在已经可以编写我们的代码了,但是编写之前,我必须说一说上下文。在插件内部的范围中,this关键字指向的是jQuery对象。人们很容易误解这一点,因为在正常使用jQuery的时候,this通常指向的是一个DOM元素。不了解这一点,会经常使用$又包装了一次。

 

(function( $ ){

  $.fn.myPlugin = function() {
  
    // 没有必要使用$(this)

    // $(this) 跟 $($('#element'))是一样的
        
    this.fadeIn('normal', function(){

      //这里的this指的就是一个DOM元素了

    });

  };
})( jQuery );

$('#element').myPlugin();

 

3,基本开发 

接下来写一个能用的插件吧。

 

(function( $ ){

  $.fn.maxHeight = function() {
  
    var max = 0;

    this.each(function() {
      max = Math.max( max, $(this).height() );
    });

    return max;
  };
})( jQuery );
var tallest = $('div').maxHeight();

 

 这是一个简单的插件,通过调用height()返回页面上height最大的div的height。

4,维护链式开发的特性

上一个例子是返回了一个整数,但是大多数情况下,一个插件紧紧是修改收集到的元素,然后返回这个元素让链条上的下一个使用。这是jQuery设计的精美之处,也是jQuery如此流行的原因之一。为了保证可链式,你必须返回this。

 

(function( $ ){

  $.fn.lockDimensions = function( type ) {  

    return this.each(function() {

      var $this = $(this);

      if ( !type || type == 'width' ) {
        $this.width( $this.width() );
      }

      if ( !type || type == 'height' ) {
        $this.height( $this.height() );
      }

    });

  };
})( jQuery );
$('div').lockDimensions('width').css('color','red');

 

 因为该插件返回了this,所以保证了可链式,从而可以继续使用jQuery方法进行修改,如css()。如果你的插件如果不是返回一个简单值,你通常应该返回this。而且,正如你可能想到的,你传进去的参数也可以在你的插件中访问。所以在这个例子中,可以访问到type。

5,默认值和选项

为了一些复杂的,可订制的插件,最好提供一套默认值,在被调用的时候扩展默认值。这样,调用函数的时候就不用传入一大堆参数,而是传入需要被替换的参数。你可以这样做:

 

(function( $ ){

  $.fn.tooltip = function( options ) {  

    var settings = {
      'location'         : 'top',
      'background-color' : 'blue'
    };

    return this.each(function() {        
      // 如果存在选项,则合并之
      if ( options ) { 
        $.extend( settings, options );
      }

      // 其他代码咯

    });

  };
})( jQuery );
$('div').tooltip({'location':'left'});

 

 在这个例子中,调用插件后,默认的location会被替换城'left',而background-color还是'blue'。这样可以保证高度可配置性,而不需要开发者定义所有可能的选项了。

6,命名空间

正确的命名空间对于插件开发十分重要,这样能确保你的插件不被其他插件重写,也能避免被页面上其他代码重写。命名空间可以使你更长寿,因为你能记录你自己的方法,事件,数据等。

a,插件方法

在任何情况下,都不要在一个插件中为jQuery.fn增加多个方法。如:

 

(function( $ ){

  $.fn.tooltip = function( options ) { // 这样 };
  $.fn.tooltipShow = function( ) { // 是   };
  $.fn.tooltipHide = function( ) { // 不好的  };
  $.fn.tooltipUpdate = function( content ) { // 同学!  };

})( jQuery );

 

 不推荐这样使用,搞乱了$.fn命名空间。要纠正之,你可以把所有的方法放进一个对象中,然后通过不同的参数来调用。

 

(function( $ ){

  var methods = {
    init : function( options ) { // THIS },
    show : function( ) { // IS   },
    hide : function( ) { // GOOD },
    update : function( content ) { // !!! }
  };

  $.fn.tooltip = function( method ) {
    
    // Method calling logic
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    }    
  
  };

})( jQuery );

 

$('div').tooltip({  // calls the init method
  foo : 'bar'
});
$('div').tooltip('hide'); // calls the hide method
$('div').tooltip('update', 'This is the new tooltip content!'); // calls the update method

jQuery自己的扩展也是使用这种插件结构。

b,事件

绑定事件的命名空间是比较不为人知的。如果你的插件绑定了某个事件,最好将它搞到一个命名空间中。这样,如果你以后需要解绑,就不会影响到其他绑定到这个事件上的函数了。你可以使用".<namespace>"来增加命名空间。

 

(function( $ ){

  var methods = {
     init : function( options ) {

       return this.each(function(){
         $(window).bind('resize.tooltip', methods.reposition);
       });

     },
     destroy : function( ) {

       return this.each(function(){
         $(window).unbind('.tooltip');
       })

     },
     reposition : function( ) { // ... },
     show : function( ) { // ... },
     hide : function( ) { // ... },
     update : function( content ) { // ...}
  };

  $.fn.tooltip = function( method ) {
    
    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    }    
  
  };

})( jQuery );

$('#fun').tooltip();
// Some time later...
$('#fun').tooltip('destroy');
 

 

在这个例子中,tooltip在init方法中初始化,它将reposition方法绑定到window对象的resize事件的tooltip名字空间下。稍候,如果开发者需要去掉这个tooltip,我们可以解绑这个绑定。这样就不会影响到其他绑定到window对象的resize事件的方法了。

c,数据

在开发插件的时候,你通常会有保持状态或者检查你的插件是否已经初始化的需要。使用jQuery的data方法是保持变量的很好的方法。但是,我们不把变量单独保存,而是放在一个对象中,这样就可以在一个名字空间下统一访问了。

 

(function( $ ){

  var methods = {
     init : function( options ) {

       return this.each(function(){
         
         var $this = $(this),
             data = $this.data('tooltip'),
             tooltip = $('<div />', {
               text : $this.attr('title')
             });
         
         // If the plugin hasn't been initialized yet
         if ( ! data ) {
         
           /*
             Do more setup stuff here
           */

           $(this).data('tooltip', {
               target : $this,
               tooltip : tooltip
           });

         }
       });
     },
     destroy : function( ) {

       return this.each(function(){

         var $this = $(this),
             data = $this.data('tooltip');

         // Namespacing FTW
         $(window).unbind('.tooltip');
         data.tooltip.remove();
         $this.removeData('tooltip');

       })

     },
     reposition : function( ) { // ... },
     show : function( ) { // ... },
     hide : function( ) { // ... },
     update : function( content ) { // ...}
  };

  $.fn.tooltip = function( method ) {
    
    if ( methods[method] ) {
      return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    }    
  
  };

})( jQuery );

 

 使用data方法可以帮助你在插件的各个方法间保持变量和状态。将各种变量放在一个对象中,可以方便访问,也可以方便移除。

7,总结与最佳实践

编写jQuery插件可以充分利用库,将公用的函数抽象出来,“循环利用”。以下是简短的总结:

 

  • 使用(function($){//plugin})(jQuery);来包装你的插件
  • 不要在插件的初始范围中重复包裹
  • 除非你返回原始值,否则返回this指针来保证可链式
  • 不要用一串参数,而是使用一个对象,并且设置默认值
  • 一个插件,不要为jQuery.fn附上多个函数
  • 为你的函数,事件,数据附着到某个命名空间
1
0
分享到:
评论

相关推荐

    jquery-validate-1.4.0

    该插件是由 Jörn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUnit 的维护人员。该插件在 2006 年 jQuery 早期的时候就已经开始出现,并一直更新至今。目前版本是 ...

    JQUERY应用开发实践指南

    除了核心框架之外,本书还用独立的章节介绍了jQuery UI、jQuery Mobile以及插件的使用和开发。在翻译期间,我们也深深地为jQuery系列框架的强大功能和精巧的设计所打动,因此,我们向广大读者推荐本书,希望它能够...

    jquery-easyui 1.5.2API

    jQuery EasyUI 1.5.2 版中文版开发工具包 EasyUI Development Toolkit Build 1 说明文档 Version 1.2 ######################################## 注意:本开发包欢迎转载,但是请完整保留该文档及开发包目录结构...

    jQuery Validation Plugin:jQuery 验证插件库源-开源

    jQuery Validation ... 该插件最初由 Jörn Zaefferer 编写和维护,Jörn Zaefferer 是 jQuery 团队的成员、jQuery UI 团队的首席开发人员和 QUnit 的维护者。 它始于 2006 年 jQuery 的早期,此后不断更新和改进。

    jQuery EasyUI 1.5.5 离线简体中文API文档 含完整开发工具包+皮肤+扩展+演示

    ├extension:easyui第三方插件库(里面会收录官方提供以及第三方提供的各类优秀插件,每个插件的用法最终都会体现到API文档当中。) │ ├locale:easyui国际化资源文件库(需要用到国际化的时候就需要在页面中引用...

    Tickbox v3.1 jQuery图片展示特效插件

    内容索引:脚本资源,jQuery,ImageBox,tickbox,jQuery插件 Tickbox 是一款基于 jQuery的图片展示特效插件,原插件由国外开发,后经legal翻译,现提供最终版v3.1的下载,内附有多个实例和调用方法,均由英文原版分离并...

    jQuery Validate插件实现表单验证

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了...具体我们可以访问 jQuery Validate 官网,下载最新版的 jQuery Validate 插件。 需要引入以下JS文件 &lt;script typ

    jQuery.validate chm格式帮助文档

    该插件是由 Jörn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUnit 的维护人员。该插件在 2006 年 jQuery 早期的时候就已经开始出现,并一直更新至今。目前版本是 ...

    推荐11款jQuery开发的复选框和单选框美化插件

    作者:Chris Spooner翻译:Terry li – GBin1.com英文: jQuery Plugins for Styling Checkbox & Radio Buttons web开发中所有的输入控件中复选框和单选框的样式是最难去设计的,因为不同的浏览器及其操作系统对于...

    24款非常有用的 jQuery 插件分享

    jQuery以其插件众多、独特、轻量以及支持大规模的网站开发闻名。本文与大家分享24款非常有用的jQuery插件,可以根据您的项目需要来选择使用。 1. jTextTranslate Translate是一款用于快速翻译文章的插件。2. ...

    详解jQuery的表单验证插件–Validation

    该插件是由 Jörn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUnit 的维护人员。该插件在 2006 年 jQuery 早期的时候就已经开始出现,并一直更新至今。访问 jQuery...

    .net,jq插件,模板,二次开发收集集合。

    .net,jq插件,模板,二次开发收集集合。包含翻译,记事本,多文件上传,在线编辑器二十多个jq插件,等!

    jQuery Tags Input Plugin(添加/删除标签插件)详解

    一个jquery开发的标签功能加强插件,可以生成或删除标签,还能对输入重复标签进行检查,和JQuery autocomplete插件配合实现自动完成功能。 官网:http://xoxco.com/projects/code/tagsinput/ 截图: (下面是翻译了...

    Jquery Validate 示例

    该插件是由 Jörn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUnit 的维护人员。该插件在 2006 年 jQuery 早期的时候就已经开始出现,并一直更新至今。本示例版本...

    jQuery.validate.js文件+使用文档+具体代码案例

    该插件是由 Jörn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUnit 的维护人员。该插件在 2006 年 jQuery 早期的时候就已经开始出现,并一直更新至今。目前版本是 ...

    jquery上传插件Uploadify3.2中文详细参考手册

    翻译后的Uploadify3.2中文使用手册,方便一线开发人员

    Antonio-Laguna-jqueryTranslator-1.1.0-0-g4477a3c.zip

    jqueryTranslator是一个jQuery插件,它使开发人员可以轻松翻译静态网站。

    PanLex翻译「PanLex Translator」-crx插件

    如果您希望扩展名自动识别源语言,请为“翻译自”选择“自动检测” 4)如果找不到所需的语言,请在“扩展选项”菜单上单击“更多语言”以打开所有受支持语言的表格 5)通过在“语言名称”下键入语言名称来搜索您喜欢...

    jquery validate表单验证的基本用法入门

    一、 jQuery Validate 插件的介绍 ...该插件是由 Jörn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUnit 的维护人员。 官方网站:http://bassistance.de/jq

    jQuery Validate

    该插件是由 Jörn Zaefferer 编写和维护的,他是 jQuery 团队的一名成员,是 jQuery UI 团队的主要开发人员,是 QUnit 的维护人员。该插件在 2006 年 jQuery 早期的时候就已经开始出现,并一直更新至今。目

Global site tag (gtag.js) - Google Analytics