如何使jQuery插件函数可以独立使用,不能在集合上运行

我阅读了插件创作的jquery文档并熟悉它。 但是,给出的示例始终对一组先前匹配的元素进行操作。 我想创建一个可以同时执行这两项操作的函数:

// example usage of my to-be-created plugin function // this is the way described in the docs, and I know how to do that $("a").myFunction () // but I also want to be able to call the function without a collection: $.myFunction (); 

如果在没有要操作的集合的情况下调用$.myFunction () ,它将创建它自己的要匹配的元素集合 – 一种初始化过程(但不一定只运行一次)。 另外, $.myFunction ()应该保持可链接性。

我想要实现的伪代码:

 // [...] function myFunction (): { if (notCalledOnACollection) { // this should run when called via $.myFunction () $elements = $("a.myClass"); } else { $elements = $(this); } return $elements.each (function () { // do sth. here }); } 

我真的希望将所有函数实现/function保留在单个函数定义中,并且在jQuery对象中的两个单独位置中没有两个单独命名的函数或两个同名函数。

当然我可以添加一个参数myFunction (do_init)来指示要执行的if语句的哪个分支,但这会使我的参数列表混乱(我想对多个插件使用该方法,并且会有myFunction ()参数为了简单起见我刚刚离开这里。

有什么好建议吗?

只需在插件定义中添加另一个引用,您就可以轻松使用标准插件代码:

 (function( $ ) { $.myPlugin = $.fn.myPlugin = function(myPluginArguments) { if(this.jquery) //"this" is a jquery collection, do jquery stuff with it } else { //"this" is not a jquery collection } }; $.fn.myPlugin.otherFunc = function() { }; })( jQuery ); 

这里唯一的区别是$.myPlugin = part,它允许你直接调用你的插件而不运行jquery的选择器函数。 如果您确定需要其他function或属性,可以将它们创建为插件的属性。

用法:

 //using a selector (arguments optional) $(".someClass").myPlugin(); //using the options variable - or whatever your arguments are $.myPlugin({id: "someId"}); //accessing your other functions/properties $.myPlugin.otherFunc();