onclick () e onblur () questão de encomenda

Eu tenho um campo de entrada que traz um menu suspenso personalizado. Eu gostaria da seguinte funcionalidade:

Quando o usuário clica em qualquer lugar fora do campo de entrada, o menu deve ser removido.Se, mais especificamente, o usuário clicar em um div dentro do menu, o menu deve ser removido,e processamento especial deve ocorrer com base em qual div foi clicado.

Aqui está minha implementação:

O campo de entrada tem umonblur() evento que apaga o menu (definindo o valor de seus paisinnerHTML para uma string vazia) sempre que o usuário clicar fora do campo de entrada. As divs dentro do menu também têmonclick() eventos que executam o processamento especial.

O problema é que oonclick() eventos nunca disparam quando o menu é clicado, porque o campo de entradaonblur() é acionado primeiro e exclui o menu, incluindo oonclick()s!

Eu resolvi o problema dividindo o divs do menuonclick() para dentroonmousedown() eonmouseup() eventos e definir um sinalizador global no mouse para baixo que é limpo no mouse para cima, semelhante ao que foi sugerido emesta resposta. Porqueonmousedown() incêndios antesonblur(), a bandeira será definida emonblur() se um dos menus divs foi clicado, mas não se algum outro lugar na tela foi. Se o menu foi clicado, eu volto imediatamenteonblur() sem excluir o menu, aguarde oonclick() para disparar, altura em que posso excluir com segurança o menu.

Existe uma solução mais elegante?

O código é algo como isto:

<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