Короткая версия: Я расширяю объектную функцию jQuery, которая должна принимать 0-3 аргумента и передавать их как аргументы со второго по четвертый в jQuery.animate
. За исключением того, что я хочу изолировать обратный вызов и добавить в конец другой вызов функции.
Я расширяю библиотеку jQuery обычным способом, через jQuery.fn.newfunction = ...
. Это пользовательская анимационная функция, в частности, расширяющая объект, чтобы его внешняя ширина, включая поля, равнялась внутренней ширине его родительского узла.
jQuery.fn.expand_to_parent_container = function() {
var args = Array.prototype.slice.call(arguments);
return this.each(function(){
var parent = $(this).parent();
parent.inner_width = parent.innerWidth();
var inner_outer_differential = $(this).outerWidth(true) - $(this).width();
// store original width for reversion later
$(this).data('original_width', $(this).width());
args.unshift({ width: parent.inner_width - inner_outer_differential });
$.fn.animate.apply($(this), args );
});
}
Достаточно просто. Я использую локальную переменную arguments
, «приводя» ее к массиву и отменяя смещение первого аргумента, который будет помещен в слот properties
.animate
( API здесь ). Следовательно, намерение состоит в том, чтобы позволить .expand_to_parent_container
принимать аргументы duration, easing, callback
, с обычным соглашением jQuery, делающим их необязательными в интуитивных шаблонах (например, если передается только функция, она становится обратным вызовом). Похоже, что jQuery.speed
отвечает за выяснение этого беспорядка, но я бы предпочел не использовать его / вмешиваться в него напрямую, потому что он не выглядит таким же публичным / устаревшим, как другие функции jQuery, и потому что я Я бы предпочел просто делегировать задачу на .animate
.
Вот моя функция возврата.
jQuery.fn.contract_to_original_size = function() {
var args = Array.prototype.slice.call(arguments);
var callback_with_width_reset = function(){
callback();
$(this).width('auto');
}
args.unshift({ width: $(this).data('original_width') });
if($(this).data('original_width')) {
$.fn.animate.apply($(this), args );
} else {
$(this).width('auto');
}
}
Я четко обозначил желаемое поведение в присваивании var callback_with_width_reset ...
, так как мне бы хотелось, чтобы свойство width было сброшено на auto, чтобы восстановить его ближе к исходному состоянию и восстановить после любого сумасшествия, которое может произойти в течение Ход множества анимаций. Однако я не знаю, как выделить функцию обратного вызова из arguments
или args
.