在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