我正在尝试编写一个 jQuery 插件,它将为调用它的对象提供额外的函数/方法。我在网上阅读的所有教程(过去2小时一直在浏览)最多包括如何添加选项,而不是附加功能。
这是我想做的事情:
//通过调用该div的插件将div格式化为消息容器
$("#mydiv").messagePlugin(); $("#mydiv").messagePlugin().saySomething("hello");
或类似的规定。归结为:我调用插件,然后调用与该插件关联的函数。我似乎无法找到一种方法来做到这一点,而且我之前已经看到很多插件都这样做了。
这是我到目前为止的插件:
jQuery.fn.messagePlugin = function() { return this.each(function(){ alert(this); }); //i tried to do this, but it does not seem to work jQuery.fn.messagePlugin.saySomething = function(message){ $(this).html(message); } };
我怎样才能实现这样的目标?
谢谢!
2013 年 11 月 18 日更新:我已将正确答案更改为 Hari 以下评论和点赞的答案。
根据 jQuery 插件创作页面 ( http://docs.jquery.com/Plugins/Authoring ),最好不要混淆 jQuery 和 jQuery.fn 命名空间。他们建议这种方法:
(function( $ ){ var methods = { init : function(options) { }, show : function( ) { },// IS hide : function( ) { },// GOOD update : function( content ) { }// !!! }; $.fn.tooltip = function(methodOrOptions) { if ( methods[methodOrOptions] ) { return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) { // Default to "init" return methods.init.apply( this, arguments ); } else { $.error( 'Method ' + methodOrOptions + ' does not exist on jQuery.tooltip' ); } }; })( jQuery );
基本上,您将函数存储在数组中(范围为包装函数),如果传递的参数是字符串,则检查条目,如果参数是对象(或 null),则恢复为默认方法(此处为“init”)。
然后你可以像这样调用方法......
$('div').tooltip(); // calls the init method $('div').tooltip({ // calls the init method foo : 'bar' }); $('div').tooltip('hide'); // calls the hide method $('div').tooltip('update', 'This is the new tooltip content!'); // calls the update method
Javascripts“参数”变量是一个包含所有传递参数的数组,因此它适用于任意长度的函数参数。