2013-02-06 37 views
0

下面的代碼基本上是我想要做的,我知道這是不正確的代碼。如何清除.hover()事件中的超時函數?

因此,對於下拉菜單,我想延遲地隱藏它。問題是,當我在隱藏延遲完成之前將鼠標懸停在另一個菜單項上時,它將覆蓋下一個handlerIn

那麼有沒有簡單的方法來清除setTimeout隊列在下一個hover()

再次,下面的不正確的代碼只是爲了解釋。

$('nav > ul > li').hover(function() { 
    clearTimeout(menuHide); 
    $(this).find('ul').show(); 
}, function() { 
    var menuHide = setTimeout(function() { 
     $(this).find('ul').hide(); 
    }, 150); 
}); 

UPDATE:好像clearInterval()是不是我要找的,因爲我還是想讓它完成,而不是放棄它。

有沒有completeInterval()? :)

回答

1

目前,您的懸停事件沒有提及menuHide,因此必須事先聲明。

var menuHide; 

$('nav > ul > li').hover(function() { 
    clearTimeout(menuHide); 
    $(this).find('ul').show(); 
}, function() { 
    menuHide = setTimeout(function() { 
     $(this).find('ul').hide(); 
    }, 150); 
}); 

編輯

在評論部分的一些合作後,我們確定把代碼animate方法的完整部分的內部是要走的路:

.animate(properties [, duration ] [, easing ] [, complete ])

+0

當然!但我發現clearInterval不是我正在尋找的東西。查看我的更新。謝謝 – fishbaitfood

+0

如果你只是從懸停中取出clearTimeout(menuHide),會發生什麼?我會想象你的超時會完成。 – Chase

+0

是的,確切地說。但是,如果我在setTimeout()完成之前將鼠標懸停在另一個菜單項上,它會覆蓋下一個'hoverIn'處理程序的代碼。這使我的下拉菜單行爲錯誤。 – fishbaitfood

0

使menuHide一個全局變量。

+2

它不需要是全局的(它不應該是),只是在整個代碼塊之上應該這樣做。 –

+0

同意。在顯示的代碼中,我們無法區分差異。 –