首頁  >  文章  >  web前端  >  jQuery中下拉式選單mouseover和mouseout反覆觸發的解決方法

jQuery中下拉式選單mouseover和mouseout反覆觸發的解決方法

黄舟
黄舟原創
2017-06-28 13:21:492412瀏覽

網路上找到的解決方法是改為mouseenter和mouseleave事件,改過之後還是不行。滑鼠滑過觸發區域,下拉選單會重複彈出、隱藏。

jQuery中下拉式選單mouseover和mouseout反覆觸發的解決方法

//purProduction为“购买产品”的id,showPurchase为下拉菜单的id
$("#purProduction").mouseenter(function() {
					$("#showPurchase").slideDown();					
				})
				$("#purProduction").mouseleave(function() {
					$("#showPurchase").slideUp();
				})
				$("#showPurchase").mouseenter(function(){
					$("#showPurchase").slideDown();
				})
				$("#showPurchase").mouseleave(function(){
					$("#showPurchase").slideUp();
				}) 				

<a class="name" id="purProduction" style="padding:20px;position:relative;left:1px;top:10px;">购买产品</a>

<div class="showDiv" id="showPurchase" style="position:absolute;left:595px;top:50px;">
			     <!-- 向上的箭头  -->
				<div class="outTri"></div>
				<div class="inTri"></div>


					<a class="item" style="display:block;font-size:15px;border-bottom:1px solid rgb(240,243,244)">查询价格</a>
					<a class="item" style="display:block;font-size:15px;border-bottom:1px solid rgb(240,243,244)">等级购买</a>
					<a class="item" style="display:block;font-size:15px;border-bottom:1px solid rgb(240,243,244)">经销商查询</a>
					<a class="item" style="display:block;font-size:15px;border-bottom:1px solid rgb(240,243,244)">合作加盟</a>

			</div>

關於你說的『反覆彈出』
其實是這樣的:滑鼠移到purProduction上,觸發彈出purProduction的mouseenter;此時滑鼠再移動到showPurchase上時,會觸發什麼事件呢?首先滑鼠離開了purProduction,觸發它的mouseleave,然後滑鼠進入showPurchase,觸發mouseenter……這還好,看起來也就收起一次再彈出一次而已,然而slideDown過程中也是會觸發事件的,當showPurchase在slideDown過程中反覆經過滑鼠附近的時候,就會反覆觸發滑鼠事件……

解決方法很簡單。最好的方法是棄用這套機制改用hover。當然如果你很不捨得你的程式碼想留用,那就要考慮用Interval來定時檢查了…比如這樣(不要怪我寫得醜,其實這事應該CSS定制)

//purProduction为“购买产品”的id,showPurchase为下拉菜单的id$("#showPurchase").slideUp();var show=false, showed=false;setInterval(function () {
  if (show && !showed) {
    $("#showPurchase").slideDown();
    showed=true;
  } else if (!show && showed) {
    $("#showPurchase").slideUp();
    showed=false;
  }}, 100);$("#purProduction").mouseenter(function() {
  show=true;})$("#purProduction").mouseleave(function() {
  show=false;})$("#showPurchase").mouseenter(function() {
  show=true;})$("#showPurchase").mouseleave(function(){
  show=false;})

是因為你的事件佇列裡面全是mouseover和mouseout的,要嘛使用:hover控制樣式,要嘛就像上面說的用stop方法去清空之前的事件佇列。

怎麼有種知乎變成StackOverflow 的感覺…

#這是因為滑鼠事件多次觸發之後,節點的動畫隊列裡堆積了多次slideDown 和slideUp,改成$('#showPurchase').stop(true).slideDown() 應該就好了。

兩種方法
第一種最簡單,把你的下拉選單和按鈕放到一個容器裡面,只需要給該容器綁定你說的兩個事件即可,其實你可以使用hover(),如果不是必須加效果還是用:hover比較簡單。
第二種結構不變的情況下實現起來略麻煩,需要使用setTimeout,一般tooltip的就是這樣子的實作。


以上是jQuery中下拉式選單mouseover和mouseout反覆觸發的解決方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn