自定义jQuery插件,包含方法和选项

时间:2010-11-26 03:52:00

标签: jquery plugins

我正在编写自己的jQuery插件,基于http://docs.jquery.com/Plugins/Authoring

(function($)
{
    var methods = 
    {
        publish : function(options) 
        {
            var settings = 
            {
                title : 'Publish'
            }
            var obj = $(this);
            var opt = $.extend(settings, options);
            return this.each(function() 
            {
                //some code here
            });
        }
    };

    $.modal = 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');
        }  
  };

})(jQuery);

现在的问题是如果我不使用:$ .fn.modal = function(method)... 错误显示:递归太多。 我想使用:$ .modal然后我可以这样称呼:$ .modal(); 如何使用自己的选项和没有$(元素)等元素的方法?

由于

2 个答案:

答案 0 :(得分:2)

解决使用:

(function($)
{
    var methods = 
    {
        publish : function(options) 
        {
            var settings = 
            {
                title : 'Publish'
            }
            var opt = $.extend(settings, options);
            //some code here
        }
    };

    jQuery.extend(function(){
        modal : 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');
            }  
      };
    });

})(jQuery);

现在我可以使用:$.modal(method, options);

答案 1 :(得分:0)

你在做什么没有错,问题是,如果你直接追加到jQuery对象而不是jQuery.fn,这个引用将指向执行的函数而不是$(元素)的元素(如果你熟悉OOP认为它是静态方法。)

因此,当您使用method.apply时,您只是传递$ .method的引用,它会更改您正在调用的函数的this引用的指针。我认为这不是你想要做的,这会导致递归。