開門見山:在做滑鼠經過離開離開 一個區域 時候觸發一個事件的時候遇到了些問題,滑鼠經過離開區域的子元素也同樣會觸發事件。這與本來的想法違背。後來找了幾個解決方案。
一開始的代碼
HTML
<div id=\'div1\'>
div1
<p id="p1">p1<span id="span1">span1</span></p>
<p id="p2">p2<span id="span2">span2</span></p>
<p id="p3">p3<span id="span3">span3</span></p>
</div>
JS
$("#div1").bind("mouseover", function(){
alert("trigger event");
});
結果是滑鼠從div1外面經過沒有問題。每從一個子元素出來經過div1都會觸發事件。這不是我們要的效果。
方案1:對其進行判斷,如果是div1就觸發事件。重要的是清楚邏輯。
滑鼠經過有4中方式。紅色代表可行,黑色代表不可行。方案1的代碼如下
JS
$("#div1").bind("mouseover", function(event){
if( !(this == event.relatedTarget) && !$(this).find(event.relatedTarget)[0]){
alert("trigger event");
}
});
PS:之前在比較event.target是否子元素的我sb了。用$("#div1").find("#p1") == $("p1")類似的代碼判斷是否為子元素。
仔細檢視是new一個對象傳回來。這比較肯定行不通。
console.log($)
function ( selector, context ) { return new jQuery.fn.init( selector, context, rootjQuery ); }
方案2:用a.compareDocumentPosition(b)。擷取 a 和 b 元素之間的位置關系。
compareDocumentPosition的用法。
compareDocumentPosition的值有4種:祖先:20(10100) 後代10(01010) 前面(00100) 後面(00010) 本身(00000)
根據這個原理可以很快的改進方案一的代碼:
JS
$("#div1").bind("mouseover", function(event){
var p = this.compareDocumentPosition(event.relatedTarget);
if(p != 20 && p != 0){
alert("trigger event");
}
});
方案3:jQuery推薦使用mouseenter/mouseleave
$("#div1").bind("mouseenter", function(event){
alert("trigger event");
});