2012-11-21 50 views
0

我正在构建一个Jquery插件。我的骨架代码如下:同时扩展JQuery插件和JQuery

(function (window, document, $, undefined) { 

    var methods = { 
     init : function(options){ 
     }, 
     func_1: function(){ 
     }, 
     func_2: function(){ 
     } 
    }; 

    $.fn.myplugin = function(args){ 

     if (methods[args]) 
     { 
      return methods[ args ].apply(this, Array.prototype.slice.call(arguments, 1)); 
     } 
     else if (typeof args === 'object' || ! args) 
     { 
      var opts = $.extend({}, $.fn.myplugin.defaults, args); 
      var new_args = new Array(opts); 
      return methods.init.apply(this, new_args); 
     } 
     else 
     { 
      $.error('Method ' + args + ' does not exist'); 
     } 
    }; 

    $.fn.myplugin.defaults = { 
     func_1: function(){}, 
     func_2: function(){} 
    }; 

}(window, document, jQuery)); 

我期待扩大这个插件,这样我可以添加额外的功能,JQuery的。所以,我想为下面呼吁这些功能:

$.myplugin.new_func(); 

我该怎么办呢?我知道我可能不得不使用$.extend,但不知道如何去做。

在此先感谢。

+0

你愿意修改插件的代码吗? – Jarry

+0

不会$ .myplugin = methods;足够? – sroes

+0

@Jarry不,我必须保持骨架,因为 –

回答

0

好的,在经历了一些较老的JQuery插件(特别是FancyBox 2)之后,我设法想出了一个办法。下面是整个框架代码:

(function (window, document, $, undefined) { 

    var methods = { 
     init : function(options){ 
     }, 
     func_1: function(){ 
     }, 
     func_2: function(){ 
     } 
    }; 

    $.fn.myplugin = function(args){ 

     if (methods[args]) 
     { 
      return methods[ args ].apply(this, Array.prototype.slice.call(arguments, 1)); 
     } 
     else if (typeof args === 'object' || ! args) 
     { 
      var opts = $.extend({}, $.fn.myplugin.defaults, args); 
      var new_args = new Array(opts); 
      return methods.init.apply(this, new_args); 
     } 
     else 
     { 
      $.error('Method ' + args + ' does not exist'); 
     } 
    }; 

    $.fn.myplugin.defaults = { 
     func_1:  function(){}, 
     func_2:  function(){} 
    }; 

    //below is the code I added to get the desired functionality 
    var D = $.myplugin = function(){}; 
    $.extend(D, { 
     new_func: function(){ 
      //add functionality here 
     } 
    }); 

}(window, document, jQuery)); 

也可以定义一个函数(称为new_func或其他)内methods对象,然后使用methods.new_func()从您的新功能,下面把它下来。

干杯。

0

$ .fn.myplugin和$ .myplugin之间的区别在于后者没有任何上下文。所以你可以使用下面的代码来定义后者。为了对$ .myplugin的结果使用链接,你只需要返回一个你想使用.new_func()方法的对象,例如某个特定的jQuery对象。

$.myplugin = function() { 
    ... 
    return $('body'); 
}; 
+0

好的。那么我真的不想在DOM上使用该方法,我只是想能够像我刚刚描述的那样调用它。我已经有'$(selector).myplugin(options)'进行DOM操作。 –