实例讲解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 对象比较实现代码
Apr 27 Javascript
JS实现多物体缓冲运动实例代码
Nov 29 Javascript
JS实现很实用的对联广告代码(可自适应高度)
Sep 18 Javascript
jQuery解析json数据实例分析
Nov 24 Javascript
javascript事件绑定学习要点
Mar 09 Javascript
省市二级联动小案例讲解
Jul 24 Javascript
微信小程序实战之轮播图(3)
Apr 17 Javascript
Angular中使用$watch监听object属性值的变化(详解)
Apr 24 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
Dec 28 Javascript
Vue 之孙组件向爷组件通信的实现
Apr 23 Javascript
对layer弹出框中icon数字参数的说明介绍
Sep 04 Javascript
React路由鉴权的实现方法
Sep 05 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
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
利用Python如何生成随机密码
2016/04/20 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
Python Lambda函数使用总结详解
2019/12/11 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
数学系毕业生的自我评价
2014/01/10 职场文书
给实习单位的感谢信
2014/02/01 职场文书
2014年党支部承诺书
2014/05/30 职场文书
社区元宵节活动总结
2015/02/06 职场文书
信访维稳承诺书
2015/05/04 职场文书
《观潮》教学反思
2016/02/17 职场文书
高三生物教学反思
2016/02/22 职场文书
Oracle用户管理及赋权
2022/04/24 Oracle