본 글에서는 jQuery에서 mouseleave와 mouseout의 차이점을 자세히 소개하고, 참고하실 수 있도록 공유합니다
많은 사람들이 jQuery를 사용하여 마우스 호버 효과를 구현할 때 일반적으로 mouseover 및 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>
Line 1, Line 2, Line 3 우리는 mouseout 이벤트를 사용할 때 드롭다운 컨테이너 #list에서 마우스가 움직이자마자 hide()가 트리거되는 것을 발견했습니다. 이는 실제로 mouseout 이벤트가 발생하기 때문입니다. 즉, 이벤트는 컨테이너의 하위 요소에 동시에 바인딩될 수 있으므로 마우스가 각 하위 요소 밖으로 이동할 때 hide()가 트리거됩니다.
jQuery 1.3부터 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 마우스아웃 이벤트 버블링 문제 해결
해결책은 jquery의 바인드 메소드를 사용하는 것입니다
예: 이제 마우스 이벤트를 모니터링해야 하는 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>
위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.