`
xxh123
  • 浏览: 33834 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

jquery 插件编写

阅读更多

当你适应了jQuery,并且想学习怎么写自己的插件,好的,你真是个爱学习的人啊。使用插件和方法来扩展jQuery非常的强大,并且通过抽象你的大部分的聪明的方法到插件中你可以节约大量的开发时间。这篇文章会为你写插件显示最基本的技能,最佳实践和一些常遇到的错误。


开始:
写jQuery的插件,开始在你的插件名字的属性中为jQuery.fn对象增加一个新的函数的属性:
jQuery.fn.myPlugin = function() {

  // Do your awesome plugin stuff here

};
不过,我们非常喜爱的$符号在哪呢?它是在那儿,但是我们必须保证我们的$符号不和别的libraries产生冲突.
传递jQuery到一个自我执行的函数(闭包),然后让$符号(作为形参)作为jquery对象,这样$符号就不会在我的执行范围内被别的库重写了.这个是一个最佳实践的实现
(function( $ ){
  $.fn.myPlugin = function() {
 
    // Do your awesome plugin stuff here

  };
})( jQuery );


上下文
现在我们拥有我们的插件,我们可以开始写我们自己实际的插件代码,不过在我们写之前,我们说一说我们的开发环境的一个词.在插件函数的当前范围内,this关键词代表引用jquery插件的jQuery对象.在jQuery介绍一个回调,this关键字代表的是一个自然的dom元素,这个经常导致开发者在jQuery函数中使用$符号来包裹this关键词,这是一个常犯的错误.
(function( $ ){
  $.fn.myPlugin = function() {
    // there's no need to do $(this) because
    // "this" is already a jquery object
    // $(this) would be the same as $($('#element'));
       
    this.fadeIn('normal', function(){

      // the this keyword is a DOM element

    });

  };
})( jQuery );

 

 基础
现在我们知道了插件的上下文,现在我们使用jquery的插件来干点什么
(function( $ ){
  $.fn.maxHeight = function() {
    var max = 0;
    this.each(function() {
      max = Math.max( max, $(this).height() );
    });

    return max;
  };
})( jQuery );
var tallest = $('div').maxHeight(); // Returns the height of the tallest div
这是一个返回最高的div高度的一个简单的插件。

 

 

保持链式可用
前面的例子我们返回了一个页面的最高的vid的一个整数值,不过我们经常使用一个插件通过某种方式来简单的修改元素的集合。并且在链式中传递他们到下一个方法。这是一个非常好的设计,并也是jquey如此流行的一个原因,所以维持一个插件的链式调用,你必须确保插件返回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集合可以继续执行jquery的方法如.css,所以如果你的插件不是返回一个固定的值,你应该一直返回this关键字在当前插件的函数范围内。和你想象的一样,你传递到插件中的参数嵌套传递到我们插件的当前的范围内。所以在前面的例子中,‘width'字符串变为了插件函数的type参数。

 

默认和选项
一些复杂并且习惯性的插件提供了很多的选项,当插件插入的时候有一个默认的可扩展的设置是一个最佳实践。这样你就可以避免使用非常多的参数,而使用少数的参数来重载默认的参数。
(function( $ ){

  $.fn.tooltip = function( options ) { 

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

    return this.each(function() {       
      // If options exist, lets merge them
      // with our default settings
      if ( options ) {
        $.extend( settings, options );
      }

      // Tooltip plugin code here

    });

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

在这个例子中,使用给定的options来调用tooltip插件后,默认的setting被重载为‘left’,而默认的背景色的设置仍然是默认的‘blue’,
所以最后的设置看起来像这样:
{
  'location'         : 'left',
  'background-color' : 'blue'
}
通过提供一个高效可配置的插件,而不是给要发者者定义所以的变量options是一个非常好的方式。

 

空间
对插件开发而言,一个合适的命名空间是插件开发非常重要的一部分。一个好的命名空间可以让你的插件被别的插件和一个页面的代码重写的机会非常的少。命名空间也可以使你的开发生活更加的容易,因为它能够更好的保存方法,事件,数据的路径。

 

 

插件的方法
在任何的情况下,我们都不应该要求在一个单独的插件在jQuery的fn对象下定义多个命名空间。
(function( $ ){

  $.fn.tooltip = function( options ) { // THIS };
  $.fn.tooltipShow = function( ) { // IS   };
  $.fn.tooltipHide = function( ) { // BAD  };
  $.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
$('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插件交互的一种标准。并被无数的插件使用包括使用最广的jQueryUI。

 

事件
很少有人知道bind方法允许命名空间绑定事件。如果你的插件绑定一个事件,命名空间是一个好的实践。这样,如果你想以后unbind事件,你能在不影响其他地方绑定了相同方法的情况下,unbind这个事件(大家看例子,具体的看unbind方法的应用),你可以通过增加“.<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方法被初始化,它通过window的resize方法绑定了 'tooltip'命名空间下的reposition方法。然后,开发者需要销毁tooltip,我们可以通过传递命名空间unbind事件的绑定。在这个例子中使用'tooltip'去解除绑定。这样我们就可以在插件外也可能有绑定事件的情况下安全的解除绑定。

 

数据
在我们插件开发的过程中,我们经常需要在给定的元素初始化后保存状态或者check。使用jQuery的data的方法是在每一个元素上保持track和变量的一个很好的方式。与我们使用不同的名字的独立的data保持track和变量相比保持我们最好使用一个单独的对象去装所以的变量和使用一个单独的数据空间去访问对象
(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帮助我们通过调用你的插件的方法保持变量和状态的track,吧你的数据命名在一个对象使我们可以很方便的访问我们的插件的属性。如果你需要移除,也可以很方便的减少数据的命名空间。

 

  

引用: http://docs.jquery.com/Plugins/Authoring

这篇也不错: http://www.iteye.com/topic/545971

分享到:
评论
3 楼 wangzhen199009 2014-02-21  
nice~
2 楼 hujp1985 2012-11-21  
1 楼 该用户名已存在 2012-11-21  

相关推荐

    jquery插件编写指南

    ### jQuery 插件编写指南详解 #### 一、引言 在前端开发中,jQuery 是一个非常流行的 JavaScript 库,它极大地简化了 HTML 文档遍历、事件处理、动画等操作,同时也支持丰富的插件机制。本文将详细介绍如何编写 ...

    jQuery插件编写步骤详解

    jQuery插件编写是jQuery框架中一个重要的组成部分,它允许开发者扩展jQuery的核心功能,创建自定义的、可复用的组件。jQuery插件的编写通常遵循一套标准的步骤,这些步骤包括: 1. **封装匿名函数**: jQuery插件...

    jquery插件编写

    ### jQuery插件编写详解 #### 一、jQuery简介 jQuery是一个功能强大且高效的JavaScript库,其设计目的是为了简化HTML文档的遍历、事件处理、动画以及与服务器端的交互等操作。作为prototype之后的一个杰出代表,...

    jQuery插件开发学习

    这篇“jQuery插件开发学习”的主题旨在帮助开发者深入理解如何利用jQuery来开发自定义插件,提高代码复用性和项目效率。下面我们将详细探讨jQuery插件开发的相关知识点。 首先,了解jQuery的核心概念是至关重要的。...

    jQuery插件,jQuery插件

    jQuery插件是JavaScript库jQuery生态系统中的一个重要组成部分,它极大地扩展了jQuery的核心功能,为开发者提供了丰富的功能和便捷...了解如何创建和使用jQuery插件,对于任何希望提升前端开发技能的人来说都是必要的。

    jquery插件.rar

    《jQuery插件开发详解》 在Web开发领域,jQuery是一个广泛应用的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画制作等任务。jQuery插件是jQuery生态系统的重要组成部分,它们扩展了jQuery的核心...

    jquery插件库-jquery抽奖插件.zip

    以"jquery插件库-jquery抽奖插件"为例,这个插件可能包含一个旋转盘的HTML结构,结合CSS3的transform属性实现3D旋转效果。JavaScript部分则通过jQuery选择器获取元素,设置动画时间和旋转角度,然后绑定click事件,...

    jquery插件库-jquery仿京东商品详情页图片放大效果.zip

    "jquery插件库-jquery仿京东商品详情页图片放大效果.zip"这个压缩包文件包含了一个jQuery插件,旨在模仿京东商品详情页中的图片放大效果,为用户提供更直观的商品查看体验。 首先,我们来详细了解一下jQuery插件的...

    sublime2 jquery插件

    在Sublime Text 2中安装jQuery插件,可以极大地提升前端开发者的工作效率,使得jQuery代码的编写更加得心应手。 jQuery是一种强大的JavaScript库,它简化了HTML文档遍历、事件处理、动画以及Ajax交互等任务,极大地...

    eclipse上支持jquery插件

    标题“eclipse上支持jquery插件”所指的就是这种能够为Eclipse添加jQuery智能提示和代码辅助功能的扩展。这样的插件使得开发者在编写jQuery代码时,可以享受到如同使用Java或其他语言一样的代码补全、错误检查和调试...

    jquery插件

    总之,jQuery插件极大地丰富了jQuery的功能,使得开发者能够快速构建功能齐全、用户体验良好的Web应用,而无需从零开始编写大量代码。通过选择合适的插件,可以节省开发时间,提高工作效率,并确保项目具备高质量和...

    Jquery插件学习

    通过这个学习实例,你应该能够逐步理解并实践以上知识点,最终达到熟练编写和使用jQuery插件的目标。记住,实践是检验学习成果的最好方式,动手尝试并不断调试你的代码,你会发现自己的技能在不断提升。

    50个jquery插件介绍

    "50个jQuery插件介绍"这篇文档很可能包含了对各种功能强大、用途广泛的jQuery插件的详细解读,帮助开发者提升网站的用户体验和功能实现。 首先,jQuery插件是jQuery库的扩展,由社区开发者创建,用于解决特定问题或...

    50个精彩JQuery插件案例

    1. **jQuery插件的原理**:jQuery插件是基于jQuery核心功能扩展的功能模块,通过$.fn.extend()方法,将新方法添加到jQuery对象的prototype上,使得所有jQuery选择器都能调用这些新方法。 2. **DOM操作**:jQuery...

    精美jQuery插件及源码

    首先,jQuery插件是基于jQuery库的功能扩展,它们是由开发者为解决特定问题或实现特殊效果而编写的代码模块。这些插件通常包括一些预定义的函数,可以轻松地整合到项目中,无需从头开始编写所有功能。通过使用jQuery...

    jquery 实现的进度条插件

    2. **jQuery插件编写**:jQuery插件通常以函数形式存在,可以通过$.fn扩展jQuery对象。一个简单的进度条插件可能会包含初始化、开始、更新和结束等方法。以下是一个基本示例: ```javascript (function($) { $.fn....

    jquery插件大全(内含Demo)

    **jQuery插件大全:打造网页交互新体验** jQuery是一个广泛使用的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画设计以及Ajax交互。这个"jQuery插件大全(内含Demo)"压缩包文件提供了丰富的...

    JQuery插件开发

    在《jQuery插件开发全解析.pdf》这份文档中,作者可能详细阐述了插件开发的各个步骤,包括如何封装私有函数、如何处理回调函数、如何利用jQuery的data方法存储插件状态,以及如何优化性能。此外,还可能涉及如何与...

    jquery插件 tabs有实例

    3. **jQuery插件编写**:编写JavaScript代码,实现点击标签时切换内容区域的显示。这里我们可以创建一个名为`tabs`的jQuery插件。 ```javascript (function($) { $.fn.tabs = function() { this.each(function() ...

Global site tag (gtag.js) - Google Analytics