Mam pole wprowadzania, które wyświetla niestandardowe menu rozwijane. Chciałbym mieć następującą funkcjonalność:
- Gdy użytkownik kliknie gdziekolwiek poza polem wejściowym, menu powinno zostać usunięte.
- Jeśli, dokładniej, użytkownik kliknie element div w menu, menu powinno zostać usunięte i powinno nastąpić specjalne przetwarzanie w zależności od tego, który element div został kliknięty.
Oto moja realizacja:
Pole wejściowe ma onblur()
zdarzenie, które usuwa menu (ustawiając jego innerHTML
element nadrzędny na pusty ciąg), gdy użytkownik kliknie poza polem wejściowym. Elementy div w menu mają również onclick()
zdarzenia, które wykonują specjalne przetwarzanie.
Problem polega na tym, że onclick()
zdarzenia nigdy nie są uruchamiane po kliknięciu menu, ponieważ pole wejściowe onblur()
uruchamia się jako pierwsze i usuwa menu, w tym onclick()
s!
I rozwiązać problem dzielenia DIV menu onclick()
do onmousedown()
i onmouseup()
wydarzenia i ustawienie globalną flagę na myszy, która jest wydalana na mysz w górę, podobny do tego, co było sugerowane w tej odpowiedzi . Ponieważ onmousedown()
uruchamia się wcześniej onblur()
, flaga zostanie ustawiona, onblur()
jeśli kliknięto jeden z elementów div menu, ale nie, jeśli gdzieś indziej na ekranie. Jeśli menu zostało kliknięte, natychmiast wracam z niego onblur()
bez usuwania menu, a następnie czekam na onclick()
uruchomienie, po czym mogę bezpiecznie usunąć menu.
Czy jest bardziej eleganckie rozwiązanie?
Kod wygląda mniej więcej tak:
<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;
...
}