2011-11-21 142 views
2

我的問題:jquery:等待一個函數來完成

我有幾個(告訴10)元素。將它們中的每一個懸停在一起執行一些具有動畫的功能。 我確實想這樣做,如果某個元素的函數(和動畫)正在運行,則懸停其他元素不會執行該函數。

例如:我徘徊了一個元素'2'。動畫開始。隨着動畫的持續,我懸停元素'3','4'和'5'。鼠標光標停留在'5'處。

我需要什麼,當元素'2'的動畫結束,並且光標保持在'5'以上時,五個動畫自動啓動。

我做了這麼:

var blocked = 0;  

$(".my_element").live('hover',function(){ 
    if(blocked == 0){ 
    blocked = 1; 
    $(this).find('.content').animate({left:"-=100px"}, function() { 
     blocked = 0; 
    }); 

}, function(){ 

}); 

但功能完成後,下一個功能不啓動,直到我扭動鼠標。誰能幫忙? thx

+0

當後續的事件被觸發,你的if語句返回false,那麼該函數的執行結束。看看改變你的if(阻塞== 0)爲一個while循環(在循環中睡眠)。 – hafichuk

+0

你將不得不創建一個隊列...當你懸停時,你添加到隊列並觸發動畫。如果動畫被阻止(已經運行),那麼它不會再次觸發。當一個動畫完成時,它會運行隊列中的下一個(或者如果沒有剩下的話就放開)。我不想爲你編寫所有的代碼,但是這可能會給你一個好主意。 – Fosco

+0

帶隊列的解決方案很有趣......但它怎麼實現......) – Sobakinet

回答

3

我認爲你的代碼還算可以,但是現在動畫停止了,你想在當前懸停的元素上拋出一個事件。這應該再次觸發動畫。我想你也想排除以前的動畫元素。

事情是這樣的:

var blocked, lastHovered, previous; 
$(".my_element").live('hover', function(){ 
    lastHovered = this; 
    if (!blocked && this != previous){ 
     blocked = true; 
     previous = this; 
     $('.content').animate({left:"-=100px"}, 1000, function() { 
     blocked = false;   
     if (lastHovered) { 
      $(lastHovered).trigger("mouseenter"); 
     } 
     }); 
    } 
    }, function() { 
    lastHovered = false; 
    }); 
+1

jQuery核心中沒有':hover'選擇器。您是否使用插件來提供該功能? –

+0

好評,沒想到那個。您可以緩存觸發了實時功能的最後一個元素,但這可能不是最佳解決方案。 – Johan

+0

嗯,看起來不錯,但無法得到它的工作... – Sobakinet