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 innerHTMLelement 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;
...
}