次の要素があるとします。
+------------------+
| |
| +----------------+
| | |
| | |
| +----------------+
| |
+------------------+
内側の要素には、親の外側に視覚的に配置できる位置付けがあり、次のように親にイベント リスナーを配置します。
parent.addEventListener('mouseover', function(e) {
// log mouse is over me
}, false);
下から親に直接マウスを合わせると、直接イベントが発生しますが、横からマウスを合わせると (最初に子を押すと) イベント ルーティングが発生するため、子がバブルアップするときにも子からイベントを受け取ります。 .
子要素から出て親スペースに入るまで左に移動し続けると、直接イベントが発生し、もう一度右に移動すると、子要素から別のバブル イベントが発生します。
これは設計によるものであり、設計はまったく問題ありませんが、マウスが私の上にあるときに単一のアクションを実行したい場合 (子アイテムを含む)、興味のないイベントをブロックするために追加の作業を行う必要があります。 . たとえば、これはうまくいきます:
var isOver = false;
parent.addEventListener('mouseover', function(e) {
if (isOver) return;
isOver = true;
// log mouse is over me
}, false);
parent.addEventListener('mouseout', function(e) {
if (e.relatedTarget == this || e.relatedTarget.isDescendantOf(this)) return;
isOver = false;
// log mouse is leaving me
}, false);
基本的に、コードには、マウスが (子を介してかどうかに関係なく) 親を「オーバード」したかどうかを判断する状態変数があり、「オーバード」している間にイベントが再び発生した場合、それらのイベントは無視されます。マウス アウト イベントもキャプチャします。聞いてみてください.. relatedTarget (あなたが入力しようとしているターゲット) は私ですか? (親)、またはMEの最終的な子供?そうであれば、何もしないでください。それ以外の場合は、「overed」状態を false に設定します。
そのコードは実際には機能しますが、次のターゲットを決定するために relatedTarget プロパティを使用できないと想像してください。この動作を行うにはどうすればよいでしょうか?
私はそれが理にかなっていることを願っています。関連するターゲットなしでそれを行うには、イベントに十分なコンテキストがないと感じていますが、eventPhase プロパティの動作を変更することに関して角度があるかもしれないと感じました (イベントが直接かバブルかを判断するため)。
また、「これは IE では機能しません、ヤッダヤッダ」という回答を探しているわけではありません。
編集、明確にするために、次のように見える単一の要素があるかのようにイベントが発生するようにします(要素が実際に上記の例の場合):
+------------------+
| |
| +--+
| |
| |
| +--+
| |
+------------------+