problem z zamówieniem onclick () i onblur ()

Mam pole wprowadzania, które wyświetla niestandardowe menu rozwijane. Chciałbym mieć następującą funkcjonalność:

Gdy użytkownik kliknie gdziekolwiek poza polem wprowadzania, menu powinno zostać usunięte.Jeśli dokładniej, użytkownik kliknie div wewnątrz menu, menu powinno zostać usunięte,i specjalne przetwarzanie powinno nastąpić w oparciu o kliknięty div.

Oto moja implementacja:

Pole wejściowe maonblur() zdarzenie, które usuwa menu (ustawiając jego rodziców)innerHTML na pusty ciąg) za każdym razem, gdy użytkownik kliknie poza polem wprowadzania. Divy w menu również mająonclick() zdarzenia, które wykonują specjalne przetwarzanie.

Problem polega na tym, żeonclick() zdarzenia nigdy nie są uruchamiane po kliknięciu menu, ponieważ pole wejścioweonblur() odpala najpierw i usuwa menu, w tymonclick()s!

Rozwiązałem problem, dzieląc divy menu ”onclick() wonmousedown() ionmouseup() zdarzenia i ustawianie globalnej flagi przy wciśniętym przycisku myszy, która jest usuwana przy przesuwaniu myszy, podobnie jak to sugerowano wta odpowiedź. Boonmousedown() strzela przedonblur(), flaga zostanie ustawionaonblur() jeśli kliknięto jeden z menu div, ale nie, jeśli gdzieś na ekranie było. Jeśli kliknięto menu, natychmiast wracam zonblur() bez usuwania menu, poczekaj naonclick() strzelać, w którym mogę bezpiecznie usunąć menu.

Czy istnieje 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;
    ...
}

questionAnswers(5)

yourAnswerToTheQuestion