#javascript #jquery #coffeescript
#javascript #jquery #coffeescript
Вопрос:
Я пишу плагин jquery в coffeescript, но не уверен, как правильно настроить часть оболочки функции.
Мой coffeescript начинается с этого:
$.fn.extend({
myplugin: ->
@each ->
Который создает javascript с оболочкой функции:
(function() {
$.fn.extend({
myplugin: function() {
return this.each(function() {
но я хочу, чтобы ‘$’ передавался следующим образом:
(function($) {
$.fn.extend({
Аналогичного окончания у меня нет … ничего конкретного в coffeescript.
Я получаю это в javascript:
})();
Но хотелось бы этого:
})(jQuery);
Кто-нибудь знает, как добиться этого с помощью компилятора coffeescript?
Или каков наилучший способ сделать это в coffeescript?
Ответ №1:
Ответ заключается в том, что вам не нужно вызывать его подобным образом в CoffeeScript — ваш скрипт уже надежно обернут в замыкание, поэтому нет необходимости в хитростях jQuery, передаваемых в качестве параметра. Просто напишите:
$ = jQuery
… в верхней части вашего скрипта, и все готово.
Ответ №2:
Если вы не используете --bare
флаг в компиляторе,
$ = jQuery
решение является наилучшим. Если вы готовы, то с помощью нового do
ключевого слова вы можете написать
do ($ = jQuery) ->
# plugin code...
таким образом, создавая желаемую область видимости, избегая путаницы в круглых скобках.
Ответ №3:
ОБНОВИТЬ / ОТРЕДАКТИРОВАТЬ: Да, согласно объяснению Джереми:
$ = 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);
Комментарии:
1. Второй имеющийся у вас блок кода немного избыточен.
jQuery
доступ к нему в любом случае осуществляется из глобальной области видимости, поэтому внутреннее закрытие просто добавляет больше кода (и более длинные цепочки областей видимости) без какой-либо пользы.
Ответ №4:
Самый простой способ — расширить объект $.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);
Ответ №5:
Вам следует взглянуть на шаблонную версию jQuery для CoffeeScript ~ https://github.com/zenorocha/jquery-boilerplate/blob/master/jquery.boilerplate.coffee
Комментарии:
1. github.com/jquery-boilerplate/jquery-boilerplate/blob/master/…
Ответ №6:
Хотя этот пост старый, я нашел его полезным. Вот код coffee-script, который работает для меня.
$ ->
$('.my-class').hello()
$.fn.hello=->
@each ->
$(@).append $ '<div>Hello</div>'
Примечание: вам не нужно объявлять $
переменную, вы можете просто использовать ее прямо из коробки.
Ответ №7:
Вы могли бы просто добавить замыкание самостоятельно и скомпилировать его с --bare
флагом.
coffee -w -c --bare jquery.plugin.coffee
(($) ->
# some code here
)(jQuery)
Ответ №8:
Просто и понятный
Это все, что мне нужно было сделать, чтобы добавить свой собственный метод cleanFadeIn
к объектам jQuery. Он также возвращает объекты для объединения в цепочку:
$.fn.extend
cleanFadeIn: -> # $('.notice').cleanFadeIn
return $(@).each -> # returns the objects for easy chaining.
$(@).slideDown 'slow', ->
$(@).fadeTo 'slow', 1