2010-04-27 47 views
1

嗨,設置/清除間隔問題

我使用下面的代碼來顯示裏面的元素的鏈接。約束條件是,一旦鼠標進入li元素,並且如果它停留在3秒內,則它需要顯示。一旦我離開李元素,它應該隱藏起來。對於這一點,我使用:

var showTimeOut; 
var thisElement 

$('.user-list li').live('mouseover',function(){ 

    thisElement = $(this).children('a.copier-link'); 

    showTimeOut = setInterval(function(){ 
     thisElement.css({'display':'block'}); 
    },3000); 
}) 

$('.user-list li').live('mouseleave',function(){ 
    clearInterval(showTimeOut); 
    thisElement.hide(); 
}) 

它的做工精細。但問題是,當我穿過李元素時,只需一秒鐘,即使間隔正在呼叫,並顯示鏈接。但我只需要顯示,如果我留在3秒內,並且需要隱藏在那裏之後,我再次留下3秒。

什麼錯我的代碼?任何其他人給我最好的建議嗎?

謝謝。

+0

你能重新生成代碼,這是你用什麼語言來表現? – ChrisBD 2010-04-27 09:39:10

+0

我對語言/框架進行了相應的假設,並對標籤進行了相應修改。 @ 3gwebtrain,如果他們證明不正確,請更改標籤。 – spender 2010-04-27 09:42:47

+0

你需要在這裏使用setInterval,它會每3秒重複一次,setTimeout會更合適嗎? – 2010-04-27 09:43:12

回答

0

也許hoverIntent jQuery Plug-In是你在找什麼?

hoverIntent是一個插件,試圖 來確定用戶的意圖......像 水晶球,只用鼠標 運動!它的工作原理類似於(並且源自jQuery的內置懸停的 )。 然而,而不是立即 調用的onMouseOver功能, 等待,直到用戶的鼠標減慢 呼叫前上下足。

+0

不,我不想使用任何插件... – 3gwebtrain 2010-04-27 10:26:18

+0

你正在使用jQuery,我沒有看到任何不使用這個插件的原因,因爲它確實會做你所需要的。 – Alex 2010-04-27 11:13:16

1

這只是一個猜測,但它可能與您使用mouseover而不是mouseenter有關。 mouseover可以觸發多次,如果你有li元素中的子元素,這將設置的時間間隔多次,覆蓋showTimeout變量的值。這意味着當mouseleave激發時,只有最後一個要設置的時間間隔纔會被清除。

試着改變你的mouseover事件mouseenter代替。我也考慮改變setIntervalsetTimeout,如setInterval將設置一個計時器來運行一個函數每3秒經常在這裏,不必再應用.css()setTimeout只會調用一次該功能。


另一個想法是setTimeout之前始終調用clearTimeout,那麼你知道,兩個定時器不能同時運行:

clearTimeout(showTimeout); 
showTimeOut = setTimeout(function(){ 
    thisElement.css({'display':'block'}); 
},3000);  
+0

謝謝,我改變了我的代碼,現在就這樣。 var showTimeOut; \t var thisElement \t \t $('。user-list li')。住( '的mouseenter',函數(){ \t \t \t \t thisElement = $(本)。兒童( 'a.copier鏈路'); \t \t \t \t showTimeOut = setTimeout的(函數(){ \t \t \t thisElement.css({ '顯示': '塊'}); \t \t},3000); \t}) \t \t $( '用戶列表裏。 ')活(' 鼠標離開',。函數(){ \t \t clearInterval(setTimeout); \t \t thisElement.hide(); \t}) 但仍然存在問題,而我通過鼠標任何一個鋰元素的功能調用,並使鏈接可見.. 任何幫助嗎? – 3gwebtrain 2010-04-27 10:23:41

+0

@ 3gwebtrain:在你的mouseleave處理函數中你有'clearInterval(setTimeout)',這應該是'clearTimeout(showTimer)'。另外,請在設置之前嘗試清除超時,因爲這將排除定時器的任何重複。 – 2010-04-27 11:32:40

+0

謝謝安迪......這是作品!再次感謝! – 3gwebtrain 2010-04-27 12:06:45