实例讲解jquery中mouseleave和mouseout的区别
本文详细的介绍了关于jQuery中mouseleave和mouseout的区别,分享给大家供大家参考,具体内容如下
很多人在使用jQuery实现鼠标悬停效果时,一般都会用到mouseover和mouseout这对事件。而在实现过程中,可能会出现一些不理想的状况。
先看下使用mouseout的效果:
<p>先看下使用mouseout的效果:</p>
<divid="container"style="width:300px;">
<divid="title"style="cursor:pointer;background:#ccc;">使用了mouseout事件↓</div>
<divid="list"style="display:none;position:absolute;background:#fff;border:1pxsolid#ccc;width:298px;">
<div>第一行</div>
<div>第二行</div>
<div>第三行</div>
</div>
</div>
<p><scripttype='text/javascript'>
jQuery(document).ready(function($){
$("#title").mouseover(function(){
varoffset=$(this).offset();
$("#list").css({left:offset.left,top:offset.top+19}).show();
});
$("#container").mouseout(function(){
$("#list").hide();
});
});
</script>
第一行第二行第三行我们发现使用mouseout事件时,鼠标只要在下拉容器#list里一移动,就触发了hide(),其实是因为mouseout事件是会冒泡的,也就是事件可能被同时绑定到了该容器的子元素上,所以鼠标移出每个子元素时也都会触发我们的hide()。
从jQuery1.3开始新增了2个mouse事件,mouseenter和mouseleave。与mouseout事件不同,只有在鼠标指针离开被选元素时,才会触发mouseleave事件。
我们来看一下mouseleave事件的效果:
<divid="container2"style="width:300px;">
<divid="title2"style="cursor:pointer;background:#ccc;">使用了mouseleave事件↓</div>
<divid="list2"style="display:none;position:absolute;background:#fff;border:1pxsolid#ccc;width:298px;">
<div>第一行</div>
<div>第二行</div>
<div>第三行</div>
</div>
</div>
<scripttype='text/javascript'>
jQuery(document).ready(function($){
$("#title2").mouseover(function(){
varoffset=$(this).offset();
$("#list2").css({left:offset.left,top:offset.top+19}).show();
});
//绑定mouseleave事件,效果很好
$("#container2").mouseleave(function(){
$("#list2").hide();
});
});
</script>
<p>
第一行第二行第三行mouseleave和mouseout事件各有用途,因为事件冒泡在某些时候是非常有用的
解决divmouseout事件冒泡的问题
解决的办法是,使用jquery的bind方法
如:现在有一个div对象需要监听他的鼠标事件
<divclass="dpx2"><divclass="dpx2_px"style="cursor:pointer;"id="searchSort">请选择排序方式↓</div> <divclass="dpx2_px_xl"id="sortList"style="display:none;position:absolute;z-index:5;"> <div><aclass="sortA">按时间升序↑</a></div> <div><aclass="sortA">按时间降序↓</a></div> <div><aclass="sortA">按评论数量升序↑</a></div> <div><aclass="sortA">按评论数量降序↓</a></div> <div><aclass="sortA">按点击数升序↑</a></div> <div><aclass="sortA">按点击数降序↓</a></div> </div> </div>
当鼠标移动到ID为searchSort的Div上时,显示下面的div。当鼠标移出下面的div时,隐藏div
JS为:
$(function(){
varsortList=$("#sortList");
$("#searchSort").mouseover(function(){
varoffset=$(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事件。
<divclass="sel_box">
<inputtype="button"value="请选择所属部门"id="sel_dept"/>
<divclass="hide"id="sel_dept_sh"style="display:none;">
<p>
<font>深圳市公司</font>
</p>
<p>
<font>集团管理层</font>
</p>
</div>
</div>
<scripttype="text/javascript">
$(".sel_box").click(function(event){
if(event.target.id=='sel_dept'){
$("#sel_dept_sh").show();//显示下拉框
$("#sel_dept_shpfont").click(function(){
$("#sel_dept").val('');
vartext=$(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>
以上就是本文的全部内容,希望对大家的学习有所帮助。