在coffeescript中编写jquery插件 - 如何获取“(function($)”和“(jQuery)”?

时间:2010-12-26 12:43:13

标签: javascript jquery coffeescript

我在coffeescript中编写了一个jquery插件,但我不确定如何使函数包装器部分正确。

我的coffeescript从这开始:

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

使用函数包装器创建javascript:

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

但我希望像这样传递'$':

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

类似于我的结局......在coffeescript中没有特别的 我在javascript中得到了这个:

})();

但是希望如此:

})(jQuery);

有谁知道如何使用coffeescript编译器实现这一目标? 或者在coffeescript中完成这项工作的最佳方法是什么?

8 个答案:

答案 0 :(得分:54)

答案是你不需要像在CoffeeScript中那样调用它 - 你的脚本已经安全地封装在一个闭包中,因此不需要jQuery-pass-in-a-parameter-tricks。只需写下:

$ = jQuery

...在你的剧本的顶部,你很高兴。

答案 1 :(得分:19)

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

$ = jQuery

解决方案是最好的。如果 ,则使用新的do关键字,您可以编写

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

因此创造了所需的范围,同时避免了括号中的混乱。

答案 2 :(得分:6)

更新/编辑:是的,根据杰里米的解释:

$ = 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);

答案 3 :(得分:3)

最简单的方法是扩展 $。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);

答案 4 :(得分:2)

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

答案 5 :(得分:2)

虽然这篇文章很老,但我发现它很有用。这是适合我的咖啡脚本代码。

$ -> 
    $('.my-class').hello()

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

注意:您无需声明$变量,只需开箱即用即可。

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

简单明了

这是我为了在jQuery对象上添加自己的方法cleanFadeIn而必须做的全部工作。它还返回链接对象:

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