[解決済み】absoluteの親divの子要素をホバーしたときのonmouseoutをjQueryなしで防止する。
2022-04-15 16:44:53
質問
で困っています。
onmouseout
関数は、絶対位置決めされた div の中で使用されます。マウスが div 内の子要素に当たったときに mouseout イベントが発生しますが、マウスが親の absolute div から出るまで発生させたくありません。
どうすれば
mouseout
イベントは、子要素に当たったときに、jquery なしで発生します。
私はこれがイベントバブリングと関係があることを知っているが、私はこれを解決する方法を見つけるのに苦労している。
ここに似たような投稿がありました。 子要素で発生するマウスアウトイベントを無効化するには?
しかし、その解決策はjQueryを使用しています。
解決方法は?
function onMouseOut(event) {
//this is the original element the event handler was assigned to
var e = event.toElement || event.relatedTarget;
if (e.parentNode == this || e == this) {
return;
}
alert('MouseOut');
// handle mouse event here!
}
document.getElementById('parent').addEventListener('mouseout',onMouseOut,true);
必要なCSSとHTMLを含むJsFiddleの簡単なデモを作りましたので、ご覧ください...
EDIT クロスブラウザ対応のためにリンクを修正しました。 http://jsfiddle.net/RH3tA/9/
ノート これは直接の親をチェックするだけで、親 div がネストした子要素を持っている場合は、何らかの方法でその親要素を走査して "Orginal element" を探さなければならないことに注意してください。
EDIT ネストした子供の例
EDIT クロスブラウザに対応するように修正しました。
function makeMouseOutFn(elem){
var list = traverseChildren(elem);
return function onMouseOut(event) {
var e = event.toElement || event.relatedTarget;
if (!!~list.indexOf(e)) {
return;
}
alert('MouseOut');
// handle mouse event here!
};
}
//using closure to cache all child elements
var parent = document.getElementById("parent");
parent.addEventListener('mouseout',makeMouseOutFn(parent),true);
//quick and dirty DFS children traversal,
function traverseChildren(elem){
var children = [];
var q = [];
q.push(elem);
while (q.length > 0) {
var elem = q.pop();
children.push(elem);
pushAll(elem.children);
}
function pushAll(elemArray){
for(var i=0; i < elemArray.length; i++) {
q.push(elemArray[i]);
}
}
return children;
}
そして、新しい JSFiddle , EDIT 更新リンク
関連
-
vueのグローバルがscss(mixin)を導入。
-
[解決済み】Node.js Error: Cannot find module express
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
nodejs unhandledPromiseRejectionWarning メッセージ
-
JavaScriptのgetElementById()メソッド入門
-
[解決済み] 親ディバイスの高さを指定せずに、子ディバイスの高さを100%にする方法は?
-
[解決済み] JavaScript / jQuery のイベントバインディングを Firebug などでデバッグするには?
-
[解決済み] 子アンカーがクリックされたときに、親のonclickイベントが発生しないようにするにはどうすればよいですか?
-
[解決済み】要素の親divを取得する
-
[解決済み] 子要素の上にドラッグすると、親要素の 'dragleave' が発生する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
HTML+CSS+JavaScriptで簡単な三目並べゲームを作成する。
-
Vueでルートネスティングを実装する例
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み] テスト
-
[解決済み】SyntaxError: JSONの位置1に予期しないトークンoがある。
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】JavaScriptの配列でforEachが関数でない不具合
-
[解決済み】リソースの読み込みに失敗した:Bind関数でサーバーが500(Internal Server Error)のステータスで応答した【非公開
-
[解決済み】(Google Map API) Geocodeは以下の理由で成功しませんでした。REQUEST_DENIED