2011-12-01 122 views
2

從我理解的使用.stop()將阻止回調函數觸發,對吧?jQuery +停止+回調函數

遺憾的是,似乎這並不在我目前的工作的腳本:

newSubMenu.stop().slideToggle(250, function() { 
    newSubMenu.css('visibility', 'visible').addClass('open'); 
}); 

動畫現在停止時雙擊,但newSubMenu仍然得到了類open,我不能找出原因。

我試圖實現的目標是在動畫完成之前不應用類open

回答

5

documentation

.stop()被稱爲元素上,當前正在運行的動畫(如果有的話)立即停止。 ...回調函數不被調用。

回調函數稱爲如果第三個參數是stop()true

但是,在您提供的代碼中,回調將運行,因爲您正在停止運行動畫,而不是在調用stop()時尚未運行的動畫slideToggle()

這是working example showing the callback being stopped

+0

@Andrej我編輯了我的答案來添加一個鏈接到一個工作示例,顯示回調被停止。 –

+0

感謝您的努力,但我是一個新手,我真的不知道如何在腳本中使用它。如果我要求你試着告訴我在腳本中如何實現這個功能,這是否太多了?我試圖在'slideToggle()'函數前放置'newSubMenu.stop();',但顯然它不能這樣工作。就像這樣:http://jsfiddle.net/Dg3yC/1/ – Andrej

+0

我想通了:)我甚至不確定是否因爲你的答案,但效果現在正是我想要的。很簡單:不是在'slideToggle()'處調用stop,而是現在在'.css()'中做這樣的操作:'newSubMenu.stop().css('visibility','visible')。 addClass('open');'這樣做,雙擊就會打開一次菜單。那就是我正在尋找的東西:)無論如何,我會標記你的激情,因爲它指向了我正確的方向!再次感謝! – Andrej

1

要知道爲什麼發生這種情況,您必須瞭解切換功能。 每次點擊時,slideToggle都會獲得slideDownslideUp的信息。

得出的結論是:每次切換完成後,你的函數將被調用,您newSubMenu得到visibility:visible風格,加上類"open"如果它不存在。

Click-> Stop all animations on element -> toggle slide -> call/excecute function 
1

.stop()可用於停止當前運行的動畫。一旦動畫完成,回調將被執行。爲了停止當前的動畫並避免被調用的回調,你需要做這樣的事情;

newSubMenu.mouseover(function(){ 
    newSubMenu.slideToggle(250, function(){ 
     $(this).css('visibility', 'visible').addClass('open'); 
    }); 
}).dblclick(function(){ 

    // this will stop the execution of the .slideToggle animation 
    // whitch will prevent the callback from being executed 
    newSubMenu.stop(); 

}); 

jsFiddle example

+0

這工作,但我不希望它滑過懸停,但點擊。並且將[你的例子](http://jsfiddle.net/k5gED/2/)從'mouseover'改爲'click',它不會停止:/我可能只是不明白你的答案背後的想法,只是簡單地使用它在我的腳本不會工作。 – Andrej

+0

@Andrej你必須記住,當你雙擊你也觸發一個點擊事件,我會在一個例子 – Teneff

+0

是的我想通了這就是爲什麼它不起作用:)但你不必做另一個例子,因爲我能夠自己解決這個問題,感謝你的所有評論,這表明我正確的方向! – Andrej

0

的jQuery已經在1.8版本中增加一個 「永遠」 回調:

總是

類型:Function(無極動畫,布爾jumpedToEnd)

當動畫完成或停止時沒有 完成(它的Promise對象被解析或被拒絕)時被調用的函數。 (版本增加:1。8)

網址:

這將始終還是被解僱,如果動畫是定期進行,如果你有stop() interupt它。