日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS子元素oumouseover触发父元素onmouseout

發(fā)布時間:2025/3/17 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS子元素oumouseover触发父元素onmouseout 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文:JS子元素oumouseover觸發(fā)父元素onmouseout

  JavaScript中,父元素包含子元素:
  當父級設(shè)置onmouseover及onmouseout時,鼠標從父級移入子級,則觸發(fā)父級的onmouseout后又觸發(fā)onmouseover;從子級移入父級后再次觸發(fā)父級的oumouseout后又觸發(fā)onmouseover。而如果onmouseover內(nèi)又應(yīng)用了計時器便會存在較大的問題。下面針對此問題給出解決方案。
  首先,在給出解決方案之前,必須先弄清楚幾個對象及方法,分別如下:
  1、事件對象
  2、事件對象相關(guān)屬性(只針對onmouseover及onmouseout),即fromElement、toElement、relatedTarget
  3、判斷一個元素是否包含另一個元素的方法,即element.contains(Node)與element.compareDocumentPosition(Node)

  既然前面已經(jīng)說了要弄清如上幾個對象及方法,那么,我們就可以分析一下倒底如何去解決這個問題。
分析:
  存在的問題是設(shè)置onmouseover時,鼠標從移入父級內(nèi)時,沒任何問題,但由父級移入子級時,以及由子級稱出到父級時會出現(xiàn)如上問題,那么我們可以想辦法設(shè)置當鼠標從父級移入到子級時,或從子級移出到父級時讓觸發(fā)對象失效,我們可以通過if語句進行判斷。而事件對象里面有個屬性可以獲取移入移出時的相關(guān)對象,下面就來介紹。

  1、事件對象:可以獲取事件對象的一系列屬性,在事件中寫一個參數(shù),即可通過參數(shù)獲取,方法如下:

1 wrap.onmouseover = function(e) { 2 e = window.event || e; // window.event是為了兼容ie下獲取事件對象,而e為標準瀏覽器直接獲取 3 }

  2、事件對象的相關(guān)對象
在觸發(fā)onmouseover及onmouseout時,必定會涉及到其它對象,如:onmouseover的相關(guān)對象,即為哪個對象進入的。onmouseout的相關(guān)對象即為進入到哪個對象。獲取方法如下:

1 wrap.onmouseover = function(e) { 2 e = window.event || e; 3 var s = e.fromElement || e.relatedTarget; //e.fromElement為IE下onmouseover獲取相關(guān)對象方法,relatedTarget為標準瀏覽器下獲取方法 4 } 5 wrap.onmouseout = function(e) { 6 e = window.event || e; 7 var s = e.toElement || e.relatedTarget; //e.toElementIE下onmouseout獲取相關(guān)對象方法,relatedTarget為標準瀏覽器下獲取方法 8 }

  3、判斷一個元素是否包含另一個元素
IE下可以使用a.contains(b)判斷a是否包含b
標準瀏覽器下a.compareDocumentPosition(b)有5個值,若為0表示為同一節(jié)點,若為2表示a位于b后面,若為4表示a位于b前面,若為10表示a為b的后代,若為20表示a為b的祖級。

  先上個即將用到的示例的HTML及CSS

1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <style type="text/css"> 6 html,body,div{margin:0;padding:0} 7 .wrapper { 8 overflow: hidden; 9 width: 800px; 10 background: black; 11 } 12 .box { 13 height: 200px; 14 background: #FF0; 15 margin: 80px 0; 16 } 17 </style> 18 </head> 19 <body> 20 <div class="wrapper" id="wrap"> 21 <div class="box" id="box"></div> 22 </div> 23 </body> 24 </html>

  既然知道了以上的獲取屬性及事件的必備方法,那么我們就可以想方法解決問題了
當觸發(fā)onmouseover時,可能是從對象以外移入的,也有可能是父級移入到子級,以及子級移出到父級,剛才也說過,onmouseover的相關(guān)對象是獲取從哪個對象進入的。如果是從外面的對象進入的,我們就執(zhí)行所需的代碼。如果是從父級移入到子級或是由子級移出到父級時,則直接跳過。
父級移入到子級對象,相關(guān)對象為父級。 子級移出到父級對象,相對對象為子級。
代碼如下:

1 wrap.onmouseover = function(e) { 2 e = window.event || e; 3 var s = e.fromElement || e.relatedTarget; 4 if (document.all) { //判斷瀏覽器是否為IE,如果存在document.all則為IE 5 if (!this.contains(s)) { // 判斷調(diào)用onmouseover的對象(this)是否包含自身或子級,如果包含,則不執(zhí)行 6 console.log('IE will over'); 7 } 8 } else { //標準瀏覽器下的方法 9 var reg = this.compareDocumentPosition(s); 10 if (!(reg == 20 || reg == 0)) { 11 console.log('Browser will over'); 12 } 13 } 14 }

  當觸發(fā)onmouseout時,可能是從父級移到子級,也可能由子級移到父級,或是移出至父級之外。
父級稱到子級,則相關(guān)對象為子級,子級稱到父級,則相關(guān)對象為父級。
代碼如下:

1 wrap.onmouseout = function(e) { 2 e = window.event || e; 3 var s = e.toElement || e.relatedTarget; 4 if(document.all) { 5 if (!this.contains(s)) { 6 console.log('IE will out'); 7 } 8 } else { 9 var reg = this.compareDocumentPosition(s); 10 if (!(reg == 20 || reg == 0)) { 11 console.log('Browser will out'); 12 } 13 } 14 }

問題也就得到了解決。

不過你會發(fā)現(xiàn):onmouseover與onmouseout的判斷方法其實是一樣的。于是我們得到:
無論是移入還是移出,只要相關(guān)對象是父級以外的就可以執(zhí)行,否則代碼不執(zhí)行。

最后,再為大家提供本人自己寫的兼容代碼,復制到JS代碼后可直接調(diào)用。代碼如下:

1 /* 2 * 功能:鼠標移入對象觸發(fā)事件,兼容所有瀏覽器并防止鼠標在父子對象間移動造成的觸發(fā)onmouseover的bug 3 * 參數(shù):第一個參數(shù)表示觸發(fā)的對象,第二個參數(shù)表示觸發(fā)的對象的事件對象,第三個對象表示要執(zhí)行的函數(shù) 4 * 作者:http://www.cnblogs.com/wuyuchang/ 5 */ 6 function mouseover(a, e, func) { 7 e = e || window.event; 8 var b = e.fromElement || e.relatedTarget; 9 10 mouseoverAndOut(a, b, func); 11 } 12 /* 13 * 功能:鼠標移出對象觸發(fā)事件,兼容所有瀏覽器并防止鼠標在父子對象間移動造成的onmouseout的bug 14 * 參數(shù):第一個參數(shù)表示觸發(fā)的對象,第二個參數(shù)表示觸發(fā)的對象的事件對象,第三個對象表示要執(zhí)行的函數(shù) 15 * 作者:http://www.cnblogs.com/wuyuchang/ 16 */ 17 function mouseout(a ,e, func) { 18 e = e || window.event; 19 var b = e.toElement || e.relatedTarget; 20 mouseoverAndOut(a, b, func); 21 } 22 /* 23 * 功能:鼠標移入或移出對象觸發(fā)事件,兼容所有瀏覽器并防止鼠標在父子對象間移動造成的onmouseover & onmouseout的bug 24 * 參數(shù):第一個參數(shù)表示觸發(fā)的對象,第二個參數(shù)表示觸發(fā)的對象的事件對象,第三個對象表示要執(zhí)行的函數(shù) 25 * 作者:http://www.cnblogs.com/wuyuchang/ 26 */ 27 function mouseoverOrOut(a, e, func) { 28 e = e || window.event; 29 var b; 30 if (e.type == 'mouseover') { 31 b = e.fromElement || e.relatedTarget; 32 } else if (e.type == 'mouseout') { 33 b = e.toElement || e.relatedTarget; 34 } 35 mouseoverAndOut(a, e, func); 36 } 37 /* 38 * 功能:鼠標移入或移出對象觸發(fā)事件,兼容所有瀏覽器并防止鼠標在父子對象間移動造成的onmouseover & onmouseout的bug 39 * 參數(shù):第一個參數(shù)表示觸發(fā)的對象,第二個參數(shù)表示觸發(fā)的對象的相關(guān)對象,第三個對象表示要執(zhí)行的函數(shù) 40 * 作者:http://www.cnblogs.com/wuyuchang/ 41 */ 42 function mouseoverAndOut(a, b, func) { 43 if (document.all) { 44 if (!(a.contains(b))) { 45 func(); 46 } 47 } else { 48 var res = a.compareDocumentPosition(b); 49 if(!(res == 20 || res == 0)){ 50 func(); 51 } 52 } 53 }

(如果是onmouseover,調(diào)用mouseover(a, e, func)即可;如果是onmouseout,調(diào)用mouseout(a, e, func)即可;或不管onmouseover還是onmouseout直接調(diào)用mouseoverOrOut(a, e, func)即可。)


以上為個人經(jīng)驗之談,如有不到之處還請留言指點。

總結(jié)

以上是生活随笔為你收集整理的JS子元素oumouseover触发父元素onmouseout的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人黄色片免费 | 粉嫩aⅴ一区二区三区四区五区 | 久久99深爱久久99精品 | 99re在线 | 一本一道久久综合 | 人妻少妇一区二区三区 | 日本人性爱视频 | 欧美成人一区二区在线 | 国产亚洲精品久久 | 久久国产经典视频 | 亚洲一区二区三区观看 | 欧美一级淫片 | 91麻豆国产福利精品 | 久久精品久久久久久久 | 欧美成人三级精品 | 欧美 日韩 国产 在线观看 | 天天舔天天操 | 手机看片一区二区 | 欧美一二三区 | 老鸭窝一区二区 | 女警白嫩翘臀呻吟迎合 | 国产女主播喷水视频在线观看 | 久久黄网站| 伊人色在线视频 | 深夜在线免费视频 | 一区二区三区久久 | av色资源| 伊人一区二区三区 | 超碰激情 | 在线观看国产成人 | 最近国语视频在线观看免费播放 | 国产精品久久国产愉拍 | 美女免费福利视频 | 中国女人裸体乱淫 | 综合天堂av久久久久久久 | 丝袜ol美脚秘书在线播放 | 葵司有码中文字幕二三区 | 午夜电影网站 | 国产精品亚洲无码 | 日本色妞 | 亚洲图片小说视频 | 高清视频在线播放 | 你懂的网址在线观看 | 一区二区一级片 | www.久久久| 一本大道视频 | 日韩精品中字 | 91大神福利视频 | av狠狠操| 欧美精品一区二区三区四区 | 成人性生交大片免费看 | 久久在线播放 | 国语对白91 | 在线观看毛片网站 | 三级视频网 | 久久性爱视频网站 | 久久久穴 | 成人午夜影视 | 亚洲一线视频 | 欧洲做受高潮欧美裸体艺术 | a级片免费观看 | 免费观看日韩 | 久久妇女 | 午夜伦伦 | 91黄色免费观看 | 成年人在线播放 | av高潮 | 91老女人 | 伊人网址 | 国产精品午夜视频 | 成人在线免费观看视频 | 欧美一卡二卡在线观看 | 开心六月婷婷 | av中出在线 | 国产精品成av人在线视午夜片 | 91九色在线| 污污网站在线播放 | 天天干天天天天 | 国产99久久 | 特级西西人体 | 免费看60分钟黄视频 | 亚欧美| 色涩av| 日本在线观看一区 | 激情另类视频 | 国产在线精品一区 | 亚洲v在线| 亚洲人午夜精品 | 国产第十页 | 女同久久另类69精品国产 | 五月婷中文字幕 | 午夜在线你懂的 | 欧美暧暧视频 | 成人国产片女人爽到高潮 | 精品久久久久久久久久岛国gif | 国产精品国产三级国产专区53 | 在哪里可以看黄色片 | av日韩国产 | 欧美最猛性xxxx |