防止滑鼠移出移入子元素觸發mouseout和mouseover事件

admin發表於2017-12-04

mouseout和mouseover事件這裡不多介紹,具體參閱javascript的mouseout和mouseover事件詳解一章節。 

這兩個事件有一個共同特點,那就是當滑鼠移入或者移出子元素的時候都會觸發對應的事件,這個往往在實際應用中是不需要的,或者說能夠帶來很大的困擾,下面就通過例項程式碼介紹一下如何避免此影響。

程式碼例項如下:

[HTML] 純文字檢視 複製程式碼執行程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>螞蟻部落</title>
<style type="text/css">
#box{
  width:200px;
  height:200px;
  background-color:red;
  padding:50px;
}
#inner{
  width:50px;
  height:50px;
  background-color:blue;
}
</style>
<script type="text/javascript"> 
function isMouseLeaveOrEnter(e, handler) {    
  var reltg=e.relatedTarget?e.relatedTarget:e.type=='mouseout'?e.toElement:e.fromElement;    
  while (reltg && reltg != handler){
     reltg = reltg.parentNode; 
  }       
  return (reltg != handler);    
} 
window.onload=function(){
  var box=document.getElementById("box");
  var num=document.getElementById("num");
  var count=0;
  box.onmouseout=function(ev){
    var ev=ev||window.event;
    if(!isMouseLeaveOrEnter(ev,box)){
      return false;
    }
    num.innerHTML=count++;
  }
}
</script>
</head>
<body>
<div id="box">
  <div id="inner"></div>
</div>
<div>事件觸發了<span id="num"></span>次</div>
</body>
</html>

以上程式碼實現了我們的要求,可以消除滑鼠指標移入或者移出子元素所帶來的困擾,雖然例子只是mouseout事件的,對於mouseover事件也是如此,下面就介紹一下此程式碼的實現過程:

一.實現原理:

當觸發這個事件的時候,事件物件都會有一個relatedTarget屬性(標準瀏覽器支援,IE8和IE8以下瀏覽器需要使用其他屬性返回),它能夠返回一個與事件目標節點相關的節點,如果返回的節點都是註冊事件的物件的子孫元素,說明是我們將要消除的事件觸發,所以只要判斷如果relatedTarget返回的節點是子孫節點,就進行特殊的處理就可以了,具體可以參閱程式碼註釋。

二.程式碼註釋:

1.function isMouseLeaveOrEnter(e, handler) {},此函式是功能的核心,可以返回一個布林值用來標識relatedTarget屬性返回的是否是子孫節點,如果返回true說明不是子孫節點,如果是false則說明是子孫節點。第一個引數是事件物件,第二個是註冊事件處理函式的物件。

2.var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement,返回事件關聯物件,相關屬性可以參閱相關閱讀。

3.while (reltg && reltg != handler){reltg = reltg.parentNode},一個while迴圈,條件是:如果reltg存在並且不是當前註冊事件的節點,如果條件不被滿足,那麼將獲取reltg的父節點然後再賦值給reltg,如此迴圈往復。這個語句的作用是判斷相關元素是否值子孫元素,如果是的話,總會有一個reltg.parentNode會和handler相同。

4.return (reltg != handler),返回一個布林值,如果相同就返回false,如果不相同就返回true。

三.相關閱讀:

1.relatedTarget屬性可以參閱javascript relatedTarget事件屬性一章節。 

2.e.type屬性可以參閱javascript type事件屬性一章節。 

3.parentNode可以參閱JavaScript parentNode 屬性一章節。 

相關文章