我正在玩弄插件,所以我转向jQuery文档,其中讨论的是没有弄乱$ .fn对象以及单个插件如何在$ .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 );
// calls the init method
$('div').tooltip();
// calls the init method
$('div').tooltip({
foo : 'bar'
});
我了解所有事情直到:
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
一部分。
我改变了这一点:
$.fn.tooltip = function(method)
{
if(myFunc[method])
{
return myFunc[method].apply();
}
}
它运作得很好......有人可以向我解释那里到底发生了什么,为什么我的工作似乎很好?
编辑:顺便说一下,我知道我没有完全继续if / else结构,因为我完全专注于我提到的那一行,而不是if结构的剩余部分。答案 0 :(得分:1)
你这样做的方式很好,但是,它不允许你将任何参数传递给你的方法。
例如,如果您的插件使用option
方法允许您更改工具提示文本选项,则可以这样调用:
$(element).tooltip("option","text","foobar!!");
如果您删除所有其他代码并使用您的方式,则option
方法将不会收到"text"
或"foobar!!!"
参数。