博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jQuery扩展方法2(转载)
阅读量:5076 次
发布时间:2019-06-12

本文共 2305 字,大约阅读时间需要 7 分钟。

我们先用最常用的插件方法创建一个库

jQuery.fn.redhome = function() {

  //库的内容

};

那么,如果要调用redhome这个方法,直接可以$obj.redhome(args)

这里解释下jQuery.fn是啥东西

jQuery = window.jQuery = window.$ = function( selector, context ) {

// The jQuery object is actually just the init constructor ‘enhanced’
return new jQuery.fn.init( selector, context );
}

jQuery.fn = jQuery.prototype = {

init: function( selector, context ) { …… }, ……
};

那么,其实很明显,$.fn.redhome其实就是jQuery.prototype.redhome,对jquery原型的扩展

这时,问题出现了,如果$符号已经被其他类库使用,那么冲突在所难免,这个时候,我们需要来创建一个闭包closure来防止$被其他库重写

(function( $ ){//闭包

  $.fn.redhome = function() {
 
    // Do your awesome plugin stuff here

  };

})( jQuery );

插件的环境

我们在调用插件的环境内,需要让this指针指向激活插件的对象。但是在一些实例中,如果调用了回调函数,this指针会指向正常的dom对象而不是jquery对象。这样经常会让程序员多余地把this指针包装一下。

(function( $ ){

  $.fn.redhome = function() {

 
    // 这里的this指向的就是jquery对象
    // $(this) 在这里就像是 $((‘#element’));
       
    this.fadeIn(‘normal’, function(){

      // this也是一个dom元素

    });

  };

})( jQuery );

参数的传递

(function( $ ){

  $.fn.redhome = function( options ) { //传入的参数options

    return this.each(function() {

      var defaults = {

        ‘location’         : ‘top’,
        ‘background-color’ : ‘blue’
      };
     
      if ( options ) {
        $.extend( defaults, options );//扩展方法原型,可以参考      }

   //插件要执行的代码

    });

  };

})( jQuery );

这样,我们就可以调用这个方法

$(‘div’).tooltip({

  ‘location’ : ‘left’//很熟悉吧,是不是想起了css()方法
});

接下来就是命名空间的问题了

我们不推荐通过这样的方法扩展

(function( $ ){

  $.fn.redhome = function( options ) { // THIS };

  $.fn.redhomeShow = function( ) { // IS   };
  $.fn.redhomeHide = function( ) { // BAD  };
  $.fn.redhomeUpdate = function( content ) { // !!!  };

})( jQuery );

这样很明显,直接占用了$.fn.的命名空间,更好的方法我们可以通过$.fn.redhome.show或者$.fn.redhome(“show”)这样的方式来调用对应的方法。

在这个选择上,jquery ui使用了后一种

(function( $ ){

  var methods = {//这个是定义redhome内部方法的类

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

  $.fn.redhome = function( method ) {

   
    // 调用方法
    if ( methods[method] ) {

      //把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.redhome’ );
    }   
 
  };

})( jQuery );

那么,我们就可以用$obj.redhome(“update”)来激活对应的方法,调用起来就比较方便。

转载于:https://www.cnblogs.com/zpc870921/archive/2012/09/05/2672085.html

你可能感兴趣的文章
Windows Server2008、IIS7启用CA认证及证书制作完整过程
查看>>
bzoj 3289 莫队 逆序对
查看>>
容斥是个什么东西我不会啊?
查看>>
Hadoop Brief
查看>>
调用手机相机的功能
查看>>
节流,防抖函数实现
查看>>
前端小demo之用vue实现一个简单的点赞组件
查看>>
P2265 路边的水沟
查看>>
P1725 琪露诺
查看>>
P1417 烹调方案
查看>>
P1541 乌龟棋
查看>>
P1680 奇怪的分组
查看>>
P2132 小Z的队伍排列
查看>>
P2212 [USACO14MAR]浇地Watering the Fields
查看>>
P1301 魔鬼之城
查看>>
P1622 释放囚犯
查看>>
P1299 切孔机
查看>>
P1725 琪露诺
查看>>
P2170 选学霸
查看>>
P1713 麦当劳叔叔的难题(90分)
查看>>