2014-12-03 61 views
0

我試圖在Nivo Lightbox中顯示的項目實現CSS動畫轉換。 我已經插入並運行了新的函數,但是下面的兩個函數在完成之前運行。如何鏈接.call()函數 - 添加轉換到Nivo燈箱

$('.nivo-lightbox-prev').off('click').on('click', function(e){ 
    e.preventDefault();     
    var index = galleryItems.index(currentLink); 
    currentLink = galleryItems.eq(index - 1); 
    if(!$(currentLink).length) currentLink = galleryItems.last(); 
    $this.options.beforePrev.call(this, [ currentLink ]); # <---- new function I added 
    $this.processContent(content, currentLink);   # <---- existing function 1 
    $this.options.onPrev.call(this, [ currentLink ]);  # <---- existing function 2 
}); 

我知道的唯一方法是將它們放在回調中,但.call()不接受回調。

我嘗試這樣做:

function beforePrev(callback){ 
    $this.options.beforePrev.call(this, [ currentLink ]); 
    callback(); 
} 
function onPrev(){ 
    $this.processContent(content, currentLink); 
    $this.options.onPrev.call(this, [ currentLink ]); 
} 
beforePrev(onPrev); 

,但它的表現一樣。

在情況下,它相關的beforePrev代碼:

beforePrev: function() { 
    el = $('.nivo-lightbox-content'); 
    el.addClass('animated fadeOutLeft'); 
    el.one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function (e) { 
     el.removeClass('fadeOutLeft'); 
    }); 
}, 

任何人都可以點我在正確的方向?


更新額外的清晰度/編輯: 這是完整的原始NIVO代碼:link

從我對它的閱讀,$this僅僅是一個標準的變量指的是初始化函數,而不是一個DOM對象。我認爲這是這很難做到的原因之一。

回答

0

原來deferind /許是這裏的關鍵,使用jQuery的。當():http://api.jquery.com/jquery.when/

這個答案:How to use "queue" or "deferred" in what condition? What are their designing purpose?幫助 - .queue()主要用於動畫和動作的DOM對象,而.deferred()用於異步操作。

所以在這個例子:

$('.nivo-lightbox-prev').off('click').on('click', function(e){ 
    e.preventDefault(); 
    var index = galleryItems.index(currentLink); 
    currentLink = galleryItems.eq(index - 1); 
    if(!$(currentLink).length) currentLink = galleryItems.last(); 
    $.when($this.options.beforePrev.call(this, [ currentLink ])).done(function(){ 
     $this.processContent(content, currentLink); 
     $this.options.onPrev.call(this, [ currentLink ]); 
    }); 
}); 

然後在beforePrev功能,通過設置.deferred()對象開始,然後.resolve()時,它是完整的,並且最後通過.promise( )回:

beforePrev: function() { 
    var deferred = $.Deferred(); 
    el = $('.nivo-lightbox-content'); 
    el.addClass('fastAnimated fadeOutRight'); 
    el.one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function (e) { 
     el.removeClass('fadeOutRight'); 
     deferred.resolve(); 
    }); 
    return deferred.promise(); 
}, 
1

使用

爲了執行函數B只有經過功能已經完成它的執行:

$('element').a() 
.queue(function() { 
    $('element').b(); 
    $(this).dequeue(); 
}); 
+0

謝謝@kapantzak - 看起來像它會工作,但我無法得到它。 我認爲**問題是'$ this'是指init對象? (這是完整的Nivo代碼:[link](https://github.com/gilbitron/Nivo-Lightbox/blob/master/nivo-lightbox.js)) – phil 2014-12-03 14:41:55