2009-11-22 4 views
1

В mootools Я привык объявлять один раз и повторно использовать его часто. Пример FX будет выглядеть следующим образом:как повторно использовать экземпляр эффекта на jquery

myEffect1 = new Fx.Slide($('myElement1')); 

Как я могу перейти на jQuery? Значение, Документы сделать его straightfoward использовать:

$('myElement1').click(function(e){ 
    this.slideToggle(); 
}); 

Но если я хочу назвать этот эффект где-то еще в моем коде мне придется повторно объявить его? И разве этот подход не является более ресурсным голодом, чем тот, который выше? Как это будет правильно сделано в jQuery?

ответ

3

Просто вручную кэшировать результат, установленный в переменной перед вызовом функции, а затем повторно использовать функцию при необходимости:

var $el_one = $("#path .to > .selection"), // Stores jQuery object 
    $el_two = $("#path .to > .second"); // Stores jQuery object 

var effect = function(){ 
    $el_one.fadeIn(); 
    $el_two.fadeOut(); 
} 

Теперь вы можете позвонить в силу через любое время без переназначения детали. Вместо этого они используют кешированный выбор jQuery для правильной анимации.

Если вам нужна дополнительная ясность, сообщите мне.

+0

Это прекрасно. Поскольку jQuery $() возвращает объект jQuery, а не элемент, он будет работать так же, как на Mootools. Благодаря! – Frankie

1
var slideToggleEffect = function(e){ 
    this.slideToggle(); 
}; 

$('myElement1').click(slideToggleEffect); 
$('myElement2').click(slideToggleEffect); 
... 
+0

Спасибо, что указали это! Тем не менее, код не создает повторно используемый экземпляр эффекта. Он повторно использует функцию, которая великолепна, но все еще требует, чтобы SIZZLE просматривал все элементы каждый раз, когда вы используете событие click, если вы анимируете другой элемент, чем тот, который был нажат. – Frankie

+1

JQuery сосредоточен вокруг объекта, который создается через jQuery (...) или $ (...). Попробуйте сыграть с jQuery.fn.slideToggle. –

+0

Thanks HappyCoder! Вы комментируете, и ответ dcneiner теперь имеет прекрасный смысл. Его просто, что mootools возвращает элемент в $(), а jQuery возвращает объект. Приходится привыкать к этому. – Frankie

1

Я бы пошел с плагином в этом случае. Например, это плагин, который я часто использую - очень простой слайд и эффект затухания.

$.fn.slideFadeToggle = function(easing, callback) { 
    return this.animate({opacity: 'toggle', height: 'toggle'}, "fast", easing, callback); 
}; 

Теперь вы можете вызвать slideFadeToggle на любой селектор, как это:

$("#somedom").slideFadeToggle(); 
+0

Несмотря на то, что это не то, что я искал, это отличный вклад Энди, спасибо! – Frankie

+1

Да, если вы часто используете одну и ту же функцию в приложении, ее будет очень удобно хранить в $ .fn (что совпадает с $ .prototype). Каждый вновь созданный jQuery ('# element') наследует все от $ .fn. –

1

Поскольку каждая команда действует на объект JQuery (объект, возвращаемый вызовом $() на селекторе), пример вы имеете это ближайшее сравнение с тем, что вы использовали в MooTools, насколько я вижу.

Больше ли ресурс голоден? Ну, это сложный вопрос для ответа, поскольку объекты-экземпляры - это всего лишь один фрагмент клиентского кода. Some framework methods for performing certain operations are better in some situations and worse in others.

+0

Спасибо, Русс! На самом деле я был обеспокоен тем, что Sizzle должен работать каждый раз, когда я вызывал эффект XYZ, потому что он срабатывает из нескольких разных элементов. Чтобы сохранить результат $ ('animated_element'), а затем повторно использовать его, как указал dcneiner, делает его более похожим на Moo. – Frankie

+1

@Frankie - полностью кэширует объект jQuery в локальной переменной, если он будет использоваться несколько раз. Я думаю, что это третье правило jQuery club (о, дорогая, я нарушил правила один и два) :) –