JavaScript和JQuery的鼠標(biāo)mouse事件冒泡處理
簡單的鼠標(biāo)移動事件:
進(jìn)入
mouseenter:不冒泡
mouseover: 冒泡
不論鼠標(biāo)指針穿過被選元素或其子元素,都會觸發(fā) mouseover 事件
只有在鼠標(biāo)指針穿過被選元素時,才會觸發(fā) mouseenter 事件
移出
mouseleave: 不冒泡
mouseout:冒泡
不論鼠標(biāo)指針離開被選元素還是任何子元素,都會觸發(fā) mouseout 事件
只有在鼠標(biāo)指針離開被選元素時,才會觸發(fā) mouseleave 事件
我們通過一個案例觀察下問題:
給一個嵌套的層級綁定mouseout事件,會發(fā)現(xiàn)mouseout事件與想象的不一樣
<!DOCTYPE html><div class="out overout" style="width:40%;height:120px; margin:0 15px;background-color:#D6EDFC;float:left;" data-mce-style="width: 40%; height: 120px; margin: 0 15px; background-color: #d6edfc; float: left;"><p style="border:1px solid red" data-mce-style="border: 1px solid red;">外部子元素</p><div class="in overout" style="width:60%;background-color:#FFCC00;margin:10px auto;" data-mce-style="width: 60%; background-color: #ffcc00; margin: 10px auto;"><p style="border:1px solid red" data-mce-style="border: 1px solid red;">內(nèi)部子元素</p><p id="inshow">0</p>
</div><p id="outshow">0</p>
</div><script type="text/javascript">
var i = 0;
var k = 0;
document.querySelectorAll('.out')[0].addEventListener('mouseout',function(e){
document.querySelectorAll("#inshow")[0].textContent = (++i)
e.stopPropagation();
},false)
document.querySelectorAll('.in')[0].addEventListener('mouseout',function(){
document.querySelectorAll("#outshow")[0].textContent = (++k)
},false)
</script>
我們發(fā)現(xiàn)一個問題mouseout事件:
1.無法阻止冒泡
2.在內(nèi)部的子元素上也會觸發(fā)
同樣的問題還有mouseover事件,那么在stopPropagation方法失效的情況下我們要如何停止冒泡呢?
1.為了阻止mouseover和mouseout的反復(fù)觸發(fā),這里要用到event對象的一個屬性relatedTarget,這個屬性就是用來判斷 mouseover和mouseout事件目標(biāo)節(jié)點的相關(guān)節(jié)點的屬性。簡單的來說就是當(dāng)觸發(fā)mouseover事件時,relatedTarget屬性代表的就是鼠標(biāo)剛剛離開的那個節(jié)點,當(dāng)觸發(fā)mouseout事件時它代表的是鼠標(biāo)移向的那個對象。由于MSIE不支持這個屬性,不過它有代替的屬性,分別是 fromElement和toElement。
2.有了這個屬性,我們就能夠清楚的知道我們的鼠標(biāo)是從哪個對象移過來,又是要移動到哪里去了。這樣我們就能夠通過判斷這個相關(guān)聯(lián)的對象是否在我們要觸發(fā)事件的對象的內(nèi)部,或者是不是就是這個對象本身。通過這個判斷我們就能夠合理的選擇是否真的要觸發(fā)事件。
3.這里我們還用到了一個用于檢查一個對象是否包含在另外一個對象中的方法,contains方法。MSIE和FireFox分別提供了檢查的方法,這里封裝了一個函數(shù)。
jQuery的處理也是如出一轍
jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout",
pointerenter: "pointerover",
pointerleave: "pointerout"
}, function(orig, fix) {
jQuery.event.special[orig] = {
delegateType: fix,
bindType: fix,
handle: function(event) {
var ret,
target = this,
related = event.relatedTarget,
handleObj = event.handleObj;
// For mousenter/leave call the handler if related is outside the target.
// NB: No relatedTarget if the mouse left/entered the browser window
if (!related || (related !== target && !jQuery.contains(target, related))) {
event.type = handleObj.origType;
ret = handleObj.handler.apply(this, arguments);
event.type = fix;
}
return ret;
}
};
});
相關(guān)文章
JavaScript獲取flash對象與網(wǎng)上的有所不同
關(guān)于js獲取flash對象,網(wǎng)上有非常多的例子,但不是我想要的,經(jīng)測試整理,因此本文誕生了2014-04-04
JavaScript判斷頁面加載完之后再執(zhí)行預(yù)定函數(shù)的技巧
這篇文章主要介紹了JavaScript判斷頁面加載完之后再執(zhí)行預(yù)定函數(shù)的技巧,原理還是利用監(jiān)聽器監(jiān)聽元素事件、被觸發(fā)則執(zhí)行函數(shù),需要的朋友可以參考下2016-05-05
判斷用戶的在線狀態(tài) onbeforeunload事件
window.event.clientX和window.event.clientY 將捕捉當(dāng)前事件發(fā)生時鼠標(biāo)相對與窗口的桌面坐標(biāo),通常情況下IE的關(guān)閉按鈕都會在頁面的右上部分,所以點關(guān)閉的時候鼠標(biāo)的坐標(biāo)的Y坐標(biāo)一定是小于0的2011-03-03

