這篇文章主要以實例詳細講解了jquery中mouseleave和mouseout的區別,模仿下拉框效果,感興趣的小伙伴們可以參考一下
本文詳細的介紹了關於jQuery中mouseleave和mouseout的差別,分享給大家供大家參考,具體內容如下
很多人在使用jQuery實現滑鼠懸停效果時,一般都會用到mouseover和mouseout這對事件。而在實現過程中,可能會出現一些不理想的狀況。
先看下使用mouseout的效果:
<p>先看下使用mouseout的效果:</p> <p id="container" style="width: 300px;"> <p id="title" style="cursor: pointer; background: #ccc;">使用了mouseout事件↓</p> <p id="list" style="display: none; position: absolute; background:#fff; border: 1px solid #ccc; width: 298px;"> <p>第一行</p> <p>第二行</p> <p>第三行</p> </p> </p> <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事件的效果:
<p id="container2" style="width: 300px;"> <p id="title2" style="cursor: pointer; background: #ccc;">使用了mouseleave事件↓</p> <p id="list2" style="display: none; position: absolute; background:#fff; border: 1px solid #ccc; width: 298px;"> <p>第一行</p> <p>第二行</p> <p>第三行</p> </p> </p> <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事件各有用途,因為事件冒泡在某些時候是非常有用的
解決p mouseout事件冒泡的問題
解決的辦法是,使用jquery的bind方法
如:現在有一個p對象需要監聽他的滑鼠事件
<p class="dpx2"><p class="dpx2_px" style="cursor:pointer;" id="searchSort">请选择排序方式↓</p> <p class="dpx2_px_xl" id="sortList" style="display:none;position:absolute;z-index:5;"> <p><a class="sortA">按时间升序↑</a></p> <p><a class="sortA">按时间降序↓</a></p> <p><a class="sortA">按评论数量升序↑</a></p> <p><a class="sortA">按评论数量降序↓</a></p> <p><a class="sortA">按点击数升序↑</a></p> <p><a class="sortA">按点击数降序↓</a></p> </p> </p>
當滑鼠移到ID為searchSort的p上時,顯示下面的p。當滑鼠移出下面的p時,隱藏p
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(); }); //关键的一句,绑定p对象的mouseleave事件 sortList.bind("mouseleave", function() { $(this).hide(); }); });
根據上述講解,模擬實現下拉效果:
1.不論滑鼠指標離開被選元素還是任何子元素,都會觸發mouseout 事件。
2.只有在滑鼠指標離開被選元素時,才會觸發 mouseleave 事件。
<p class="sel_box"> <input type="button" value="请选择所属部门" id="sel_dept" /> <p class="hide" id="sel_dept_sh" style="display: none;"> <p> <font>深圳市公司 </font> </p> <p> <font>集团管理层 </font> </p> </p> </p> <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>
以上是jquery事件w中mouseout和mouseleave的差異分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!