在coffeescript写一个jquery插件 – 如何获得“(函数($)”和“(jQuery)”?

我正在写一个jQuery插件在coffeescript,但不知道如何获得正确的function包装部分。

我的咖啡开始于此:

$.fn.extend({ myplugin: -> @each -> 

用函数包装器创buildjavascript:

 (function() { $.fn.extend({ myplugin: function() { return this.each(function() { 

但我想要一个'$'像这样传入:

 (function($) { $.fn.extend({ 

类似的结局我有…没有特别的咖啡脚本。
我得到这个在JavaScript中:

 })(); 

但是会这样:

 })(jQuery); 

有谁知道如何实现与coffeescript编译器? 或者在coffeescript中完成这个工作的最好方法是什么?

答案是,你不需要像在CoffeeScript中那样调用它 – 你的脚本已经被安全地封装在一个闭包中,所以不需要将jQuery作为参数传入。 写吧:

 $ = jQuery 

…在脚本的顶部,你很好走。

除非你在编译器中使用--bare标志,否则

 $ = jQuery 

解决scheme最好。 如果你 ,那么用新的关键字,你可以写

 do ($ = jQuery) -> # plugin code... 

从而创造了所需的范围,同时避免了括号的混乱。

更新/编辑:是的 ,按照杰里米的解释:

 $ = jQuery $.fn.myPlugin = () -> console.log('test fired') 

编译为:

 (function() { var $; $ = jQuery; $.fn.myPlugin = function() { return console.log('test fired'); }; }).call(this); 

作为一个jQuery插件工作得很好: $('body').myPlugin();

原版的:

好吧,我想我可能会接近这个,让我知道是否有帮助。

 (($) -> $.fn.extend = myplugin: -> @each: -> )(jQuery) 

呈现为:

 (function() { (function($) { return $.fn.extend = { myplugin: function() {}, this.each: function() {} }; })(jQuery); }).call(this); 

最简单的方法是扩展$ .fn对象

简单的jQuery插件可以用CoffeeScript编写,如下所示:

 $.extend $.fn, disable: -> @each -> e = $(this) e.attr("disabled", "disabled") if e.is("button") or e.is("input") 

它会编译到

 (function() { $.extend($.fn, { disable: function() { return this.each(function() { var e; e = $(this); if (e.is("button") || e.is("input")) { return e.attr("disabled", "disabled"); } }); } }); }).call(this); 

你应该看看jQuery Boilerplate的CoffeeScript版本〜https: //github.com/zenorocha/jquery-boilerplate/blob/master/jquery.boilerplate.coffee

虽然这个post是旧的,我发现它很有用。 这是咖啡脚本代码,适合我。

 $ -> $('.my-class').hello() $.fn.hello=-> @each -> $(@).append $ '<div>Hello</div>' 

注意 :您不需要声明$variables,您可以直接使用它。

您可以简单地自己添加闭包,并使用--bare标志进行编译。

coffee -w -c --bare jquery.plugin.coffee

 (($) -> # some code here )(jQuery) 

简单而直接

这就是为了在jQuery对象中添加我自己的方法cleanFadeIn所必须做的。 它还返回链接的对象:

 $.fn.extend cleanFadeIn: -> # $('.notice').cleanFadeIn return $(@).each -> # returns the objects for easy chaining. $(@).slideDown 'slow', -> $(@).fadeTo 'slow', 1