Проблемы с упорядочиванием onclick () и onblur ()

У меня есть поле ввода, которое вызывает пользовательское выпадающее меню. Я хотел бы следующую функциональность:

Когда пользователь щелкает в любом месте за пределами поля ввода, меню должно быть удалено.Если, более конкретно, пользователь нажимает на div внутри меню, меню должно быть удалено,а также специальная обработка должна происходить в зависимости от того, какой div был нажат.

Вот моя реализация:

Поле ввода имеетonblur() событие, которое удаляет меню (путем установки его родителяinnerHTML в пустую строку) всякий раз, когда пользователь щелкает за пределами поля ввода. Дивы внутри меню также имеютonclick() события, которые выполняют специальную обработку.

Проблема в том, чтоonclick() события никогда не запускаются при нажатии меню, потому что поле вводаonblur() срабатывает первым и удаляет меню, включаяonclick()s!

Я решил проблему, разделив меню div'овonclick() вonmousedown() а такжеonmouseup() события и установка глобального флага при наведении мыши, который сбрасывается при наведении мыши вверх, аналогично тому, что было предложено вэтот ответ, Потому что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;
    ...
}

Ответы на вопрос(5)

Ваш ответ на вопрос