防止滑鼠移出移入子元素觸發mouseout和mouseover事件
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 屬性一章節。
相關文章
- jQuery滑鼠移入移出jQuery
- 淺談mouseenter和mouseover,mouseout和mouseleave
- vue 滑鼠移入顯示圖示 ,滑鼠移出隱藏圖示Vue
- 滑鼠進入移出事件事件
- 滑鼠事件css的:hover和js的mouseover有什麼區別?事件CSSJS
- JavaScript mouseout 事件JavaScript事件
- Hadoop資料傳輸:如何將資料移入和移出Hadoop?Hadoop
- JavaScript mouseover 事件JavaScript事件
- js 建立和觸發事件 和 自定義事件JS事件
- touch事件和click事件多次觸發的問題事件
- Vue事件獲取觸發事件物件和繫結事件物件Vue事件物件
- 取消事件觸發事件
- JS滑鼠事件完成元素拖拽(簡單-高階)JS事件
- CSS實現滑鼠移入彈出下拉框CSS
- jQuery select 觸發事件jQuery事件
- JQuery4:滑鼠事件和滾動事件jQuery事件
- 企圖為vuex新增發布訂閱:事件繫結和事件觸發Vue事件
- 觸控板和滑鼠增強Middle
- React setState和修改props觸發的鉤子React
- 使用 jQuery 觸發 Vue 事件jQueryVue事件
- 取消事件觸發(妙啊)事件
- 滑鼠事件事件
- vue中在父元件點選按鈕觸發子元件的事件Vue元件事件
- mvvm模式 事件觸發器[wpf]MVVM模式事件觸發器
- 觸控板和滑鼠增強工具:Middle MacMac
- 滑鼠拖拽事件事件
- 滑鼠右鍵斷觸
- CSS遮罩/定位下面元素不能觸發CSS遮罩
- javascript避免dom事件重複觸發JavaScript事件
- 觸控板和滑鼠增強軟體:Middle for MacMac
- 雙擊事件(dblclick)時,不觸發單擊事件(click)事件
- 微信小遊戲開發(4)-動畫和觸控事件遊戲開發動畫事件
- Tkinter 吐槽之二:Event 事件在子元素中共享事件
- 監聽滑鼠事件事件
- 滑鼠、鍵盤事件事件
- angular 的滑鼠事件Angular事件
- 事件 滑鼠事件 表單事件 from表單事件
- Simple WPF: WPF 透明窗體和滑鼠事件穿透事件穿透
- JavaScript和JQuery的滑鼠mouse事件冒泡處理JavaScriptjQuery事件