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

发布于 2024-10-08 21:19:10 字数 617 浏览 4 评论 0原文

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

我的coffeescript以此开头:

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

它使用函数包装器创建了javascript:

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

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

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

与结尾类似,我...在coffeescript中没有什么特别的。
我在 javascript 中得到了这个:

})();

但想要这样:

})(jQuery);

有谁知道如何使用咖啡脚本编译器来实现这一点? 或者在 Coffeescript 中完成此操作的最佳方法是什么?

I am writing a jquery plugin in coffeescript but am not sure how to get the function wrapper part right.

My coffeescript starts with this:

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

Which creates the javascript with a function wrapper:

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

but I want a '$' passed in like this:

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

Similar for the ending I have... nothing in particular in coffeescript.
I get this in javascript:

})();

But would like this:

})(jQuery);

Does anyone know how to achieve this with the coffeescript compiler?
Or what is the best way to get this done within coffeescript?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

不知所踪 2024-10-15 21:19:10

答案是,您不需要像 CoffeeScript 中那样调用它——您的脚本已经安全地包装在闭包中,因此不需要 jQuery-passed-in-as-a-parameter-tricks。 写下: ...,就可以开始了。

$ = jQuery

只需在脚本顶部

The answer is that you don't need to call it like that in CoffeeScript -- your script is already safely wrapped in a closure, so there's no need for jQuery-passed-in-as-a-parameter-tricks. Just write:

$ = jQuery

... at the top of your script, and you're good to go.

鸩远一方 2024-10-15 21:19:10

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

$ = jQuery

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

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

这样创建所需的范围,同时避免括号混乱。

Unless you're using the --bare flag in the compiler, the

$ = jQuery

solution is best. If you are, then with the new do keyword, you can write

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

thus creating the desired scope while avoiding a mess o' parentheses.

苏璃陌 2024-10-15 21:19:10

更新/编辑:是的,根据 Jeremy 的解释:

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

UPDATE/EDIT: Yep, as per Jeremy's explanation:

$ = jQuery

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

compiles to:

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

Which works just fine as a jQuery plugin: $('body').myPlugin();

Original:

Okay, i think I may getting close on this one, let me know if it helps.

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

renders into:

(function() {
  (function($) {
    return $.fn.extend = {
      myplugin: function() {},
      this.each: function() {}
    };
  })(jQuery);
}).call(this);
酒中人 2024-10-15 21:19:10

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

The easiest way is to extend $.fn object

Simple jQuery plugin can be written in CoffeeScript as follows:

$.extend $.fn,

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

it will compile to

(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);
辞慾 2024-10-15 21:19:10

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

You should take a look at the CoffeeScript version of jQuery Boilerplate ~ https://github.com/zenorocha/jquery-boilerplate/blob/master/jquery.boilerplate.coffee

回忆躺在深渊里 2024-10-15 21:19:10

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

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

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

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

Although this post is old I found it useful. Here is the coffee-script code that works for me.

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

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

Note: You don't need to declare the $ variable, you can just use it right out of the box.

红衣飘飘貌似仙 2024-10-15 21:19:10

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

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

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

You could simply add the closure yourself and compile it with the --bare flag.

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

(($) ->
  # some code here
)(jQuery)
撩发小公举 2024-10-15 21:19:10

简单而直接

这就是我在 jQuery 对象上添加我自己的方法 cleanFadeIn 所要做的全部事情。它还返回用于链接的对象:

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

Simple and Straightforward

This is all I had to do in order to add my own method, cleanFadeIn, on jQuery objects. It returns the objects for chaining as well:

$.fn.extend
  cleanFadeIn: ->                     # $('.notice').cleanFadeIn
    return $(@).each ->               # returns the objects for easy chaining.
      $(@).slideDown 'slow', ->
        $(@).fadeTo 'slow', 1
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文