簡短版本:我擴展了一個jQuery對象函數,該函數打算取0-3個參數並將它們作爲第二個到第四個參數傳遞到jQuery.animate
。除此之外,我想隔離回調,並在其末尾添加另一個函數調用。擴展庫時追加jQuery回調函數
我正在擴展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 here)中。因此,我們的意圖是允許.expand_to_parent_container
採用參數duration, easing, callback
,並採用通常的jQuery約定,使其在直觀模式下可選(例如,如果僅傳遞一個函數,則它將成爲回調函數)。似乎jQuery.speed
負責解決這個混亂,但我寧願不直接使用它/篡改它,因爲它看起來不像其他jQuery函數那樣是public/deprecation-proof,並且因爲我會而只是將任務委託給.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屬性被重置爲自動,這樣既可以更接近恢復到原來的狀態,並從任何瘋狂恢復可能發生在很多動畫過程中。但是,我不知道如何從arguments
或args
中得出回調函數。
+1。如果你決定打破它,你將不會成爲第一個,事實上jQuery UI 1.8已經打破了它。 – 2010-07-01 16:09:09