[解決済み] onclick() と onblur() の順序問題
質問
カスタムドロップダウンメニューを表示させる入力フィールドがあります。 私は以下の機能を希望します。
- ユーザーが入力フィールドの外側のどこかをクリックすると、メニューが削除されるようにする。
- より具体的には、ユーザがメニュー内の div をクリックした場合、メニューを削除するようにします。 と のように、どの div がクリックされたかに基づいて特別な処理が行われる必要があります。
以下は私の実装です。
入力フィールドには
onblur()
イベントがあり、これはメニューを削除します (親の
innerHTML
を空文字列に設定することで)メニューを削除します。 メニューの中の div も
onclick()
イベントが発生し、特殊な処理が実行されます。
問題なのは
onclick()
イベントが発生しないことです。なぜなら、メニューがクリックされても入力フィールドの
onblur()
イベントが最初に発生し、メニューが削除され、その中に
onclick()
s!
メニューのdivを分割することで問題を解決しました。
onclick()
を
onmousedown()
と
onmouseup()
イベントで提案されたものと同様に、マウスダウン時にグローバルフラグを設定し、マウスアップ時にクリアするようにします。
この回答
. なぜなら
onmousedown()
が実行される前に
onblur()
にフラグが設定されます。
onblur()
にフラグがセットされ、画面上の他の場所がクリックされた場合はセットされません。 もしメニューがクリックされたなら、私はすぐに
onblur()
から戻り、メニューが削除されることなく、次に
onclick()
が鳴るのを待ち、その時点でメニューを安全に削除することができます。
もっとエレガントな解決策はないのでしょうか?
コードは次のようなものです。
<div class="menu" onmousedown="setFlag()" onmouseup="doProcessing()">...</div>
<input id="input" onblur="removeMenu()" ... />
var mouseflag;
function setFlag() {
mouseflag = true;
}
function removeMenu() {
if (!mouseflag) {
document.getElementById('menu').innerHTML = '';
}
}
function doProcessing(id, name) {
mouseflag = false;
...
}
どのように解決するのですか?
私もあなたと全く同じ問題を抱えていました。私の UI は、あなたが説明したとおりに設計されています。私は、単に
onClick
を
onMouseDown
. 他には何もしていません。
onMouseUp
もなく、フラグもありません。これにより、ブラウザがこれらのイベント ハンドラの優先順位に基づいて自動的に順序を変更することで、私が追加作業をすることなく、問題が解決されました。
この方法がうまくいかない理由はありますか?
関連
-
Vueの要素ツリーコントロールに破線を追加する説明
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
フロントエンド非同期(アシンク)ソリューション(全ソリューション)
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] URLを新しいタブで開く(新しいウィンドウではない)
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] addEventListenerとonclickの比較
-
[解決済み] [Solved] 'blur'イベントが発生したとき、フォーカスがどの要素に*行ったかを調べるにはどうすればよいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
Vueのイベント処理とイベントモディファイアの解説
-
[解決済み] テスト
-
[解決済み】JavaScriptの配列でforEachが関数でない不具合
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み】「X-Frame-Options」を「SAMEORIGIN」に設定したため、フレームでの表示を拒否された。
-
[解決済み】TypeScript-のAngular Frameworkエラー - "exportAsがngFormに設定されたディレクティブはありません"
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された
-
JavaScriptのgetElementById、getElementsByTagNam、getElementsByClassNameの違いと使い方