javascript中mouseover、mouseout使用詳解
本文并沒(méi)有像標(biāo)題說(shuō)的那樣,真正阻止事件元素的子元素冒泡...
只是在子元素冒泡到事件元素處時(shí)進(jìn)行了一個(gè)判斷,判斷是否要觸發(fā)事件,哦...不對(duì) 應(yīng)該是是否要運(yùn)行事件函數(shù)中的相關(guān)操作...
首先你可以猛戳這里: 問(wèn)題的出現(xiàn)
注:jquery中的mouseover/out事件也有此問(wèn)題
解決方法一:
在ie下有mouseenter 與 mouseleave事件來(lái)替代mouseover 和 mouseout。
網(wǎng)上很多說(shuō)法,這兩個(gè)事件只有ie支持,其他瀏覽器不支持。
但是我在最新版本的火狐與谷歌都支持了mouseenter 與 mouseleave!?。。。?/p>
另外ie是的支持范圍是:[ie5+ ,所以我們還是別噴ie了...
其他瀏覽器測(cè)試了下:
在Firefox/3.6.28是不支持mouseenter 與 mouseleave的,F(xiàn)irefox具體從哪個(gè)版本開(kāi)始支持這兩個(gè)事件,就不得而知了...
在Opera9.50 Alpha 與Opera9.00 Beta都不支持。其實(shí)Opera現(xiàn)在完全可以不要測(cè)試了,最新版的Opera都是webkit內(nèi)核...
谷歌低版本未測(cè)試...
當(dāng)然這些老版本瀏覽器基本可以不用管了,所以這應(yīng)該是最好的解決辦法了:用mouseenter 與 mouseleave事件來(lái)替代mouseover 和 mouseout。
此二事件的實(shí)例戳這:mouseenter與mouseleave
注:jquery中也有mouseenter 與 mouseleave事件,兼容所有瀏覽器。
解決方法二:
上面那個(gè)方法在老版本的火狐與谷歌是不支持的,如果你希望得到最大范圍的兼容,那可以繼續(xù)往下看
我們利用var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement 來(lái)獲取事件相關(guān)元素。再通過(guò)這個(gè)事件相關(guān)元素它跟事件元素的關(guān)系(包含的關(guān)系),來(lái)判斷是否做相關(guān)事件處理。
對(duì)于mouseout事件來(lái)說(shuō),reltg就是鼠標(biāo)指針離開(kāi)目標(biāo)時(shí),鼠標(biāo)指針進(jìn)入的節(jié)點(diǎn)。
對(duì)于mouseover 事件來(lái)說(shuō),reltg就是鼠標(biāo)指針移到目標(biāo)節(jié)點(diǎn)上時(shí)所離開(kāi)的那個(gè)節(jié)點(diǎn)。
在li的mouseout的事件函數(shù)中,如果reltg為li的子元素我們就不要運(yùn)行相關(guān)操作,如果reltg為li的父元素就運(yùn)行相關(guān)操作。
我們可以通過(guò)下面的isMouseLeaveOrEnter函數(shù)來(lái)判斷l(xiāng)i與reltg的包含關(guān)系:
//判斷事件相關(guān)元素與li的關(guān)系 如果事件相關(guān)元素為li的子元素就返回false 反之返回true function isMouseLeaveOrEnter(e, handler) { if (e.type != 'mouseout' && e.type != 'mouseover') return false; var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement; while (reltg && reltg != handler) reltg = reltg.parentNode; return (reltg != handler); }; Li.onmouseout = function(e) { e = e||window.event; if (isMouseLeaveOrEnter(e,this)) { //運(yùn)行相關(guān)操作 }; }
此方法明顯的缺點(diǎn)就是isMouseLeaveOrEnter中要遍歷所有的父元素了,性能問(wèn)題
解決方法三:
此方法與方法二其實(shí)思路是一樣的,只是我們這里通過(guò)compareDocumentPosition/contains來(lái)判斷l(xiāng)i與reltg的包含關(guān)系,優(yōu)化了方法二遍歷所有父元素帶來(lái)的性能問(wèn)題。
直接看代碼吧:
//判斷node是否為parent的子元素 //if node == parent 也會(huì)返回true function contains(parent, node) { if(parent.compareDocumentPosition){ //ff var _flag = parent.compareDocumentPosition(node); return (_flag == 20 || _flag == 0)? true : false; }else if(parent.contains){ //ie return parent.contains(node); } }; Li.onmouseout = function(e) { e = e||window.event; var relatedEle = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement if (!contains(this, relatedEle)) { show.innerHTML=show.innerHTML+'0'; } }
compareDocumentPosition() 方法比較兩個(gè)節(jié)點(diǎn),并返回描述它們?cè)谖臋n中位置的整數(shù)。
返回值可能是:
1:沒(méi)有關(guān)系,兩個(gè)節(jié)點(diǎn)不屬于同一個(gè)文檔。
2:第一節(jié)點(diǎn)(P1)位于第二個(gè)節(jié)點(diǎn)后(P2)。
4:第一節(jié)點(diǎn)(P1)定位在第二節(jié)點(diǎn)(P2)前。
8:第一節(jié)點(diǎn)(P1)位于第二節(jié)點(diǎn)內(nèi)(P2)。
16:第二節(jié)點(diǎn)(P2)位于第一節(jié)點(diǎn)內(nèi)(P1)。
32:沒(méi)有關(guān)系,或是兩個(gè)節(jié)點(diǎn)是同一元素的兩個(gè)屬性。
注釋:返回值可以是值的組合。例如,返回 20 意味著在 p2 在 p1 內(nèi)部(16),并且 p1 在 p2 之前(4)。
而[ie8- 不支持compareDocumentPosition()方法,需要用contains代替compareDocumentPosition()方法那么強(qiáng)大,它是用來(lái)確定 nodeB 是否包含在另一個(gè) nodeA 中:nodeA .contains( nodeB )
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- 兼容ie和firefox的鼠標(biāo)經(jīng)過(guò)(onmouseover和onmouseout)實(shí)現(xiàn)--簡(jiǎn)短版
- javascript mouseover、mouseout停止事件冒泡的解決方案
- js ondocumentready onmouseover onclick onmouseout 樣式
- 實(shí)現(xiàn)onmouseover和onmouseout應(yīng)用于RadioButtonList或CheckBoxList控件上
- onmouseover和onmouseout的一些問(wèn)題思考
- 基于mouseout和mouseover等類似事件的冒泡問(wèn)題解決方法
- 經(jīng)過(guò)綁定元素時(shí)會(huì)多次觸發(fā)mouseover和mouseout事件
相關(guān)文章
JavaScript實(shí)現(xiàn)表單注冊(cè)、表單驗(yàn)證、運(yùn)算符功能
在本篇文章里我們給大家整理了關(guān)于JavaScript中表單注冊(cè)、表單驗(yàn)證、運(yùn)算符的代碼示例,有興趣的朋友們可以測(cè)試學(xué)習(xí)下。2018-10-10頁(yè)面回到頂部的三種實(shí)現(xiàn)(錨標(biāo)記,js)
本文不再介紹,大家根據(jù)自己需要選擇其中的一種即可,總之簡(jiǎn)約最美的,能減少代碼就減少代碼,能不調(diào)用的就別調(diào)用,要不是天緣博客的文章都是牛長(zhǎng)也不會(huì)添加這個(gè)功能2012-10-10javascript驗(yàn)證只能輸入數(shù)字和一個(gè)小數(shù)點(diǎn)示例
使用javascript限制只能輸入數(shù)字和一個(gè)小數(shù)點(diǎn),在某些情況下還是比較使用的,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下2013-10-10javascript 讀取內(nèi)聯(lián)之外的樣式(style、currentStyle、getComputedStyle區(qū)別介紹
最常用的是style屬性,在JavaScript中,通過(guò)document.getElementById(id).style.XXX就可以獲取到XXX的值,但意外的是,這樣做只能取到通過(guò)內(nèi)嵌方式設(shè)置的樣式值,即style屬性里面設(shè)置的值。2010-05-05利用JS實(shí)現(xiàn)簡(jiǎn)單的瀑布流加載圖片效果
今天學(xué)習(xí)了一個(gè)瀑布流加載效果,很多網(wǎng)站都有瀑布流效果,下面通過(guò)本文給大家分享利用JS實(shí)現(xiàn)簡(jiǎn)單的瀑布流加載圖片效果,需要的朋友參考下吧2017-04-04Javascript代碼混淆綜合解決方案-Javascript在線混淆器
Javascript代碼混淆綜合解決方案-Javascript在線混淆器...2006-12-12QRCode.js二維碼生成并能長(zhǎng)按識(shí)別
這篇文章主要為大家詳細(xì)介紹了QRCode.js二維碼生成并能長(zhǎng)按識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10(推薦一個(gè)超好的JS函數(shù)庫(kù))S.Sams Lifexperience ScriptClassLib
(推薦一個(gè)超好的JS函數(shù)庫(kù))S.Sams Lifexperience ScriptClassLib...2007-04-04json數(shù)據(jù)處理技巧(字段帶空格、增加字段、排序等等)
json數(shù)據(jù)處理技巧例如:正常取值、字段帶空格、賦值、增加字段、排序、拷貝、數(shù)組添加和刪除等,詳細(xì)請(qǐng)參考本文或許對(duì)你有所幫助2013-06-06