onmouseover事件和onmouseout事件全面理解
這兩天接觸了onmouseover事件和onmouseout事件,一直以為它們只是簡(jiǎn)單的分別實(shí)現(xiàn)鼠標(biāo)指針移動(dòng)到元素上時(shí)觸發(fā)事件和在鼠標(biāo)指針移出指定的對(duì)象時(shí)觸發(fā)事件,但是突然發(fā)現(xiàn)這些只是對(duì)它們簡(jiǎn)單的描述,下面讓我們一起看看它們終究還有神馬奇怪的特性,是好還是壞呢?
首先實(shí)現(xiàn)一個(gè)盒子:

給這個(gè)盒子上綁定上onmouseover事件和onmouseout事件

發(fā)現(xiàn)它們不會(huì)發(fā)生什么問(wèn)題,然后(嘿嘿,你懂得?。?/p>

讓我們創(chuàng)建一個(gè)B元素,讓它被嵌套在A元素中,作為A的子元素

我們依舊只給外層父元素A綁定onmouseover事件和onmouseout事件,你會(huì)發(fā)現(xiàn)發(fā)生什么了呢?對(duì),沒(méi)錯(cuò)!當(dāng)鼠標(biāo)移入移除A的子元素B的時(shí)候居然也發(fā)生了onmouseover事件和onmouseout事件!!Why?這不是我想要的!難道這時(shí)候B就不在是A的一部分了嗎?當(dāng)然不是,要不也不會(huì)在移入B元素時(shí)發(fā)生onmouseover事件。這樣證明,B元素還是A不可分割的一部分啊。
那到底是怎么回事呢?終究還是事件冒泡搞得鬼?大家都知道常用的瀏覽器中有兩種事件流:事件冒泡和事件捕獲。讓我們看一下事件冒泡的定義:事件按照從最特定的事件目標(biāo)逐級(jí)向上傳播到最不特定的事件目標(biāo)(document對(duì)象)的順序。所以說(shuō)當(dāng)鼠標(biāo)移入移除A的子元素B的時(shí)候,B的onmouseover事件和onmouseout事件會(huì)觸發(fā),但是它自己沒(méi)有這兩個(gè)事件啊,就把這兩個(gè)事件傳遞給了它的父元素A,A有這兩個(gè)事件所以就發(fā)生了我們看到的情況。
有人會(huì)說(shuō)那怎么避免呢,畢竟不是所有人都會(huì)是這種需求嘛,我們只要父級(jí)元素的事件觸發(fā)就好,子級(jí)元素就讓它靜靜的當(dāng)個(gè)美男子就好了。
所以W3C在mouseover和mouseout事件中添加了relatedTarget屬性 :
•在mouseover事件中,它表示鼠標(biāo)來(lái)自哪個(gè)元素
•在mouseout事件中,它指向鼠標(biāo)去往的那個(gè)元素
而而Microsoft在mouseover和mouseout事件中添加了兩個(gè)屬性
•fromElement,在mouseover事件中表示鼠標(biāo)來(lái)自哪個(gè)元素
•toElement,在mouseout事件中指向鼠標(biāo)去往的那個(gè)元素
所以我們就有了如下代碼的實(shí)現(xiàn)
document.getElementById('box1').onmouseover = function (e) {
if (!e) e = window.event;
var reltg = e.relatedTarget ? e.relatedTarget : e.fromElement;
while (reltg && reltg != this) reltg = reltg.parentNode;
if (reltg != this) {
// 這里可以編寫(xiě) onmouseenter 事件的處理代碼
alert('111');
}
}
document.getElementById('box1').onmouseout = function (e) {
if (!e) e = window.event;
var reltg = e.relatedTarget ? e.relatedTarget : e.toElement;
while (reltg && reltg != this) reltg = reltg.parentNode;
if (reltg != this) {
// 這里可以編寫(xiě) onmouseleave 事件的處理代碼
alert('2222');
}
}
以上所述是小編給大家介紹的onmouseover事件和onmouseout事件的全面了解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- js 阻止子元素響應(yīng)父元素的onmouseout事件具體實(shí)現(xiàn)
- 通過(guò)onmouseover選項(xiàng)卡實(shí)現(xiàn)img圖片的變化
- JS小功能(onmouseover實(shí)現(xiàn)選擇月份)實(shí)例代碼
- onmouseover和onmouseout的一些問(wèn)題思考
- js ondocumentready onmouseover onclick onmouseout 樣式
- 兼容ie和firefox的鼠標(biāo)經(jīng)過(guò)(onmouseover和onmouseout)實(shí)現(xiàn)--簡(jiǎn)短版
- js下關(guān)于onmouseout、事件冒泡的問(wèn)題經(jīng)驗(yàn)小結(jié)
相關(guān)文章
JavaScript實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
基于javascript canvas實(shí)現(xiàn)五子棋游戲
這篇文章主要介紹了基于javascript canvas實(shí)現(xiàn)的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
JavaScript Reflect Metadata實(shí)現(xiàn)詳解
這篇文章主要介紹了JavaScript Reflect Metadata實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
JavaScript 經(jīng)典實(shí)例日常收集整理(常用經(jīng)典)
本文是小編日常收集整理些js經(jīng)典實(shí)例,非常具有參考借鑒價(jià)值,需要的朋友一起了解了解吧2016-03-03
JavaScript高級(jí)程序設(shè)計(jì)閱讀筆記(十六) javascript檢測(cè)瀏覽器和操作系統(tǒng)-detect.js
javascript檢測(cè)瀏覽器和操作系統(tǒng) detect.js使用介紹,需要的朋友可以參考下2012-08-08
那些項(xiàng)目中常見(jiàn)的TypeScript錯(cuò)誤總結(jié)
這篇文章主要給大家總結(jié)介紹了一些項(xiàng)目中常見(jiàn)的TypeScript錯(cuò)誤的相關(guān)資料,如果你想查看所有的錯(cuò)誤信息和錯(cuò)誤碼,可以瀏覽TypeScript的源代碼倉(cāng)庫(kù),當(dāng)然隨著?ts?版本的更新,官網(wǎng)也會(huì)逐漸增加更多新的類型錯(cuò)誤,需要的朋友可以參考下2022-03-03
基于JavaScript實(shí)現(xiàn)年份數(shù)字拼圖效果
時(shí)光荏苒,2022年又要收尾了,公司的年會(huì)是不是都安排上了?前幾天看到一個(gè)年會(huì)抽獎(jiǎng)系統(tǒng),功能十分的強(qiáng)大,其中有一個(gè)年份數(shù)字的拼圖效果深深的吸引了哥,決定用JS實(shí)現(xiàn)一下該效果,需要的可以參考一下2022-12-12
js+html5實(shí)現(xiàn)半透明遮罩層彈框效果
這篇文章主要為大家詳細(xì)介紹了js+html5實(shí)現(xiàn)半透明遮罩層彈框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07

