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();
            });
        });

时间: 2024-08-01 14:41:00

jQuery中mouseleave和mouseout的区别详解的相关文章

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

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

jquery中attr和prop的区别详解(非常完整)

关于它们两个的区别,网上的答案很多 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 相比attr,prop是1.6.1才新出来的,两者从中文意思理解,都是获取/设置属性的方法(attributes和properties).只是,window或document中使用.attr()方法在jQuery1.6之前不能正常运行,因为window和document中不能有attributes.prop应运而生了.

jquery中children()与find()用法区别详解

children()是一个筛选器,顾名思义就是筛选孩子,筛选那些符合条件的孩子. 完整的格式如下: .children(expr) 其中children是筛选器的名称,expr是表达式,所有选择器中的表达式都可以用在这,比如按标签名"div",按类名".class",按序号":first"等等,如果表达式为空,那么返回的是所有的孩子,返回的结果仍为jQuery对象. jquery取索引使用eq函数. eq() 选择器选取带有指定 index 值的

jquery中的ajax同步和异步详解_AJAX相关

之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题.最近的项目用了到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除. 而异步则这个AJAX代码运行中的时候其他代码一样可以运行. jquery的async:false,这个属性 默认是true:异步,false:同步. $.ajax({ type: "post", url: "

Android中asset和raw的区别详解_Android

*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到 R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 *读取文件资源

jquery中的ajax同步和异步详解

之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题.最近的项目用了到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面假死状态解除. 而异步则这个AJAX代码运行中的时候其他代码一样可以运行. jquery的async:false,这个属性 默认是true:异步,false:同步. $.ajax({ type: "post", url: "

Android中asset和raw的区别详解

*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到 R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 *读取文件资源

jQuery中extend函数的实现原理详解_jquery

extend()是jQuery中一个重要的函数,作用是实现对对象的扩展, 它经常用于jQuery插件的开发,jQuery内部也使用它来扩展属性方法,如上篇文章中讲到的noConflict方法,就是用extend方法来扩展的. 在jQuery的API手册中,我们看到,extend实际上是挂载在jQuery和jQuery.fn上的两个不同方法,尽管在jQuery内部jQuery.extend()和jQuery.fn.extend()是用相同的代码实现的,但是它们的功能却不太一样.来看一下官方API对

jQuery中prepend()方法使用详解_jquery

prepend()方法将指定元素插入匹配元素按内部的开头,其作用和prependTo()方法基本相同,只在语法上有差别,虽然说在语法形式上看基本相同. 下面介绍下语法结构: 复制代码 代码如下: $(selector).prepend(content) 参数列表: demo: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author&qu