我正在编写自己的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(); 如何使用自己的选项和没有$(元素)等元素的方法?
由于
答案 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引用的指针。我认为这不是你想要做的,这会导致递归。