实例讲解jquery中mouseleave和mouseout的区别

前端技术 2023/09/05 JavaScript

本文详细的介绍了关于jQuery中mouseleave和mouseout的区别,分享给大家供大家参考,具体内容如下
很多人在使用jQuery实现鼠标悬停效果时,一般都会用到mouseover和mouseout这对事件。而在实现过程中,可能会出现一些不理想的状况。
先看下使用mouseout的效果:

<p>先看下使用mouseout的效果:</p>
<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>
<p>

第一行第二行第三行mouseleave和mouseout事件各有用途,因为事件冒泡在某些时候是非常有用的
解决div mouseout事件冒泡的问题
解决的办法是,使用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();
      });
    });

根据上述讲解,模拟实现下拉效果: 
1.不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。

2.只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。

<div class=\"sel_box\">
  <input type=\"button\" value=\"请选择所属部门\" id=\"sel_dept\" />
  <div class=\"hide\" id=\"sel_dept_sh\" style=\"display: none;\">
    <p>
      <font>深圳市公司 </font>
    </p>
    <p>
      <font>集团管理层 </font>
    </p>
  </div>
</div>
 
<script type=\"text/javascript\">
$(\".sel_box\").click(function(event){
   if(event.target.id == \'sel_dept\'){
     $(\"#sel_dept_sh\").show(); //显示下拉框
     $(\"#sel_dept_sh p font\").click(function(){
       $(\"#sel_dept\").val(\'\');
       var text = $(this).text();
      // alert(text);
       $(\"#sel_dept\").val(text).css(\"color\",\"#000\");
       $(\"#sel_dept_sh\").hide();
     });
 
   }else{
     $(\"#sel_dept_sh\").hide();
   }
   
 
});
 
$(\".sel_box\").bind(\"mouseleave\",function(){//用mouseleave就实现了模仿下拉框的效果
    $(this).find(\".hide\").hide();  
  });
 
$(\".sel_box\").bind(\"mouseout\",function(){//而mouseout则不行,什么时候都会触发
    $(this).find(\".hide\").hide();  
  });
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文地址:https://www.stayed.cn/item/12580

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。