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


Posted in Javascript onFebruary 17, 2016

本文详细的介绍了关于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>

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

Javascript 相关文章推荐
JavaScript 事件冒泡简介及应用
Jan 11 Javascript
Javascript JSQL,SQL无处不在,
May 05 Javascript
js电话号码验证方法
Sep 28 Javascript
理解JavaScript中worker事件api
Dec 25 Javascript
Vue.js原理分析之observer模块详解
Feb 17 Javascript
vue-router路由与页面间导航实例解析
Nov 07 Javascript
vue-cli3中vue.config.js配置教程详解
May 29 Javascript
vue 设置 input 为不可以编辑的实现方法
Sep 19 Javascript
Layui数据表格 前后端json数据接收的方法
Sep 19 Javascript
JavaScript this使用方法图解
Feb 04 Javascript
Element Input输入框的使用方法
Jul 26 Javascript
js 函数性能比较方法
Aug 24 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
Feb 17 #Javascript
Bootstrap中CSS的使用方法
Feb 17 #Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
Feb 17 #Javascript
基于javascript简单实现对身份证校验
Jan 25 #Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
Feb 17 #Javascript
Bootstrap布局组件应用实例讲解
Feb 17 #Javascript
深入php面向对象、模式与实践
Feb 16 #Javascript
You might like
Apache2中实现多网站域名绑定的实现方法
2011/06/01 PHP
ThinkPHP之getField详解
2014/06/20 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
浅析jQuery1.8的几个小变化
2013/12/10 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
python比较两个列表是否相等的方法
2015/07/28 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
Python实现对adb命令封装
2020/03/06 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
五一服装活动方案
2014/01/11 职场文书
家居饰品店创业计划书
2014/01/31 职场文书
伊索寓言教学反思
2014/05/01 职场文书
启动仪式策划方案
2014/06/14 职场文书
就业意向书
2014/07/29 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
横空出世观后感
2015/06/09 职场文书
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS