我在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中完成这项工作的最佳方法是什么?
答案 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