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