カスタムドロップダウンメニューを表示する入力フィールドがあります。次の機能が必要です。
- ユーザーが入力フィールドの外側をクリックすると、メニューが削除されます。
- 場合は、より具体的には、メニュー内のdiv要素をユーザーがクリックすると、メニューを削除する必要があり、かつ特別な処理がクリックされたdiv要素に基づいて行うべきです。
これが私の実装です:
入力フィールドには、ユーザーが入力フィールドの外をクリックしたときにonblur()
メニューを削除する(その親innerHTML
を空の文字列に設定する)イベントがあります。メニュー内のdivにはonclick()
、特別な処理を実行するイベントもあります。
問題はonclick()
、入力フィールドonblur()
が最初に起動され、onclick()
s を含むメニューが削除されるため、メニューがクリックされたときにイベントが起動しないことです。
メニューのdiv onclick()
をonmousedown()
とonmouseup()
イベントに分割し、マウスダウン時にグローバルフラグを設定することで問題を解決しました。このフラグは、この回答で提案されているものと同様です。のonmousedown()
前onblur()
に起動するためonblur()
、メニューdivの1つがクリックされた場合はフラグが設定されますが、画面の他の場所がクリックされた場合は設定されません。メニューがクリックされた場合は、メニュー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;
...
}