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