最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript中mouseover、mouseout使用詳解

 更新時(shí)間:2015年07月19日 11:24:40   投稿:hebedich  
這篇文章主要介紹了javascript中mouseover、mouseout使用詳解的相關(guān)資料,需要的朋友可以參考下

本文并沒有像標(biāo)題說的那樣,真正阻止事件元素的子元素冒泡...

只是在子元素冒泡到事件元素處時(shí)進(jìn)行了一個(gè)判斷,判斷是否要觸發(fā)事件,哦...不對(duì) 應(yīng)該是是否要運(yùn)行事件函數(shù)中的相關(guān)操作...

首先你可以猛戳這里: 問題的出現(xiàn)

 注:jquery中的mouseover/out事件也有此問題

解決方法一:

在ie下有mouseenter 與 mouseleave事件來替代mouseover 和 mouseout。

網(wǎng)上很多說法,這兩個(gè)事件只有ie支持,其他瀏覽器不支持。

但是我在最新版本的火狐與谷歌都支持了mouseenter 與 mouseleave!?。。?!

另外ie是的支持范圍是:[ie5+ ,所以我們還是別噴ie了...

其他瀏覽器測(cè)試了下:

      在Firefox/3.6.28是不支持mouseenter 與 mouseleave的,F(xiàn)irefox具體從哪個(gè)版本開始支持這兩個(gè)事件,就不得而知了...

                 在Opera9.50 Alpha 與Opera9.00 Beta都不支持。其實(shí)Opera現(xiàn)在完全可以不要測(cè)試了,最新版的Opera都是webkit內(nèi)核...

      谷歌低版本未測(cè)試...

當(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)事件處理。

對(duì)于mouseout事件來說,reltg就是鼠標(biāo)指針離開目標(biāo)時(shí),鼠標(biāo)指針進(jìn)入的節(jié)點(diǎn)。

對(duì)于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 也會(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:沒有關(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)容了,希望大家能夠喜歡。

相關(guān)文章

最新評(píng)論

巨鹿县| 张家川| 濉溪县| 广水市| 永昌县| 湟中县| 贺兰县| 海丰县| 理塘县| 修水县| 佛冈县| 肥东县| 鄂托克旗| 秀山| 手游| 温泉县| 甘南县| 古浪县| 榆中县| 丰镇市| 隆子县| 郎溪县| 曲周县| 永新县| 灵川县| 华安县| 罗平县| 平谷区| 嘉定区| 霞浦县| 泌阳县| 台中县| 法库县| 黄山市| 射阳县| 缙云县| 舒城县| 任丘市| 凤凰县| 河曲县| 江油市|