2011-11-17 136 views
0

我的網站上有浮動框。我在mousenter上顯示它並隱藏onmouseleave。就像這樣:jquery:在效果之前添加延遲

$(box).mouseenter(function(evt) {showBox();}); 

$(what).parent().mouseleave(function(evt) {hideBox();}); 

當我進行過 「盒子」 快速移動鼠標它顯示了。 如何不在這種情況下顯示它? 謝謝。

+0

您可以發佈hideBox而showBox藏漢?也許做一個jsfiddle? – BjarkeCK

回答

2
var showTimer; 

$(box).hover(function(){ 
    // wait .5 sec to show the box 
    showTimer = setTimeout(showBox, 500); 

}, function(){ 
    // wipe timer so that showBox isn't called if < .5 sec 
    if(showTimer){ 
     clearTimeout(showTimer); 
     showTimer = null; 
    } 

    hideBox(); 
} 
+0

謝謝!有用。 – Nick

1

纏上你的setTimeout函數調用()

$(box).mouseenter(function(evt) { setTimeout("showBox()",1000);}); 

,其中1000爲1秒。 (1000 milisecond = 1秒)

編輯:

這可能是一個有點複雜,那麼我想。如果快速退出,則必須防止它出現。

var t; 
$(box).mouseenter(function(evt) { t = setTimeout("showBox()",1000);}); 
$(box).mouseleave(function(evt) { clearTimeout(t); }); 
$(what).parent().mouseleave(function(evt) {clearTimeout(t);hideBox();}); 
function showBox(){ 
    clearTimeout(t); 
    // the rest or your function 
} 
+0

當您快速完成鼠標移動時,它僅在1秒後顯示。 這您將需要。但你也需要清除你的mouseleave的超時時間。對? – BjarkeCK

+0

是這樣的嗎? –

1

我發現bindWithDelay插件對這類場景非常有用。

這是合租容易寫類似:

$(box).bindWithDelay("mouseenter", function() { ... }, 500); 

此事件觸發之前增加500ms的延遲。它處理了事件觸發多次時必須設置/取消/重置定時器的所有工作。

(它也支持方便的節流選項更復雜的情況,你可以在鏈接閱讀)

+0

你仍然需要取消事件 –

+0

是的,這是事實,當然可以在'mouseleave'事件中完成。該插件與其他答案中發佈的代碼幾乎完全相同。我發現把所有的管道都隱藏起來很方便。特別是如果你在一頁上有幾個這樣的東西。 – njr101