1. 程式人生 > >jQuery中mouseleave和mouseout的區別

jQuery中mouseleave和mouseout的區別

很多人在使用jQuery實現滑鼠懸停效果時,一般都會用到mouseover和mouseout這對事件。而在實現過程中,可能會出現一些不理想的狀況。

先看下使用mouseout的效果:

<div id="container" style="width: 300px;">
<div id="title" style="cursor: pointer; background: #ccc;">使用了mouseout事件↓</div>
<div id="list" style="display: none; position: absolute; background:#fff; border: 1px solid #ccc; width: 298px;">
<div>第一行</div>
<div>第二行</div>
<div>第三行</div>
</div>
</div>
<p>
<script type='text/javascript'> 
jQuery(document).ready(function($) { 
     $("#title").mouseover(function() { 
         var offset = $(this).offset(); 
         $("#list").css({left: offset.left, top: offset.top+19}).show(); 
     }); 
     $("#container").mouseout(function() { 
         $("#list").hide(); 
     }); 
 }); 
</script>

我們發現使用mouseout事件時,滑鼠只要在下拉容器#list裡一移動,就觸發了hide(),其實是因為mouseout事件是會冒泡的,也就是事件可能被同時繫結到了該容器的子元素上,所以滑鼠移出每個子元素時也都會觸發我們的hide()。

從jQuery 1.3開始新增了2個mouse事件,mouseenter和mouseleave。與mouseout事件不同,只有在滑鼠指標離開被選元素時,才會觸發 mouseleave 事件。
我們來看一下mouseleave事件的效果:
<div id="container2" style="width: 300px;">
<div id="title2" style="cursor: pointer; background: #ccc;">使用了mouseleave事件↓</div>
<div id="list2" style="display: none; position: absolute; background:#fff; border: 1px solid #ccc; width: 298px;">
<div>第一行</div>
<div>第二行</div>
<div>第三行</div>
</div>
</div>
<script type='text/javascript'> 
jQuery(document).ready(function($) { 
     $("#title2").mouseover(function() { 
         var offset = $(this).offset(); 
         $("#list2").css({left: offset.left, top: offset.top+19}).show(); 
     }); 
     // 繫結mouseleave事件,效果很好 
     $("#container2").mouseleave(function() { 
         $("#list2").hide(); 
     }); 
 }); 
</script>

mouseleave和mouseout事件各有用途,因為事件冒泡在某些時候是非常有用的。但是當我們不需要冒泡的時候,確實也挺煩人的。

*********************************************************************************************************************************************************

在使用jquery進行事件監聽時,有可能會出現事件冒泡的問題 

解決的辦法是,使用jquery的bind方法 

如:現在有一個div物件需要監聽他的滑鼠事件:

<div class="dpx2"><div class="dpx2_px" style="cursor:pointer;" id="searchSort">請選擇排序方式↓</div>
            <div class="dpx2_px_xl"  id="sortList" style="display:none;position:absolute;z-index:5;">
                <div><a class="sortA">按時間升序↑</a></div>
                <div><a class="sortA">按時間降序↓</a></div>
                <div><a class="sortA">按評論數量升序↑</a></div>
                <div><a class="sortA">按評論數量降序↓</a></div>
                <div><a class="sortA">按點選數升序↑</a></div>
                <div><a class="sortA">按點選數降序↓</a></div>
            </div>
        </div>

當滑鼠移動到ID為searchSort的Div上時,顯示下面的div。當滑鼠移出下面的div時,隱藏div

JS為:

 $(function(){
                 var sortList = $("#sortList");
            $("#searchSort").mouseover(function() {
                 var offset = $(this).offset();
                sortList.css("left", offset.left);
                sortList.css("top", offset.top+20);
                sortList.show();
            });
//關鍵的一句,繫結Div物件的mouseleave事件
            sortList.bind("mouseleave", function() {
                $(this).hide();
            });
        });